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;.}.