Check-in [a02cd88d8d]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:implementing ST_SnapAndSplit, ST_LinestringXxxSegmentLength and fixing a bug in ST_InterpolatePoint
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: a02cd88d8d37a8cfa36462b89477551721b07ed3
User & Date: sandro 2019-09-01 14:42:50
Context
2020-01-10
17:03
switching to automake 1.16.1 and many miscellaneous fixes check-in: 4ed175d571 user: sandro tags: trunk
2019-09-01
14:42
implementing ST_SnapAndSplit, ST_LinestringXxxSegmentLength and fixing a bug in ST_InterpolatePoint check-in: a02cd88d8d user: sandro tags: trunk
2019-07-31
21:23
removing any reference to the infamous DQS misfeature - take two check-in: 41b92e961f user: sandro tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to spatialite-sql-latest.html.

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
....
1880
1881
1882
1883
1884
1885
1886




























1887
1888
1889
1890
1891
1892
1893
....
2706
2707
2708
2709
2710
2711
2712














2713
2714
2715
2716
2717
2718
2719
				<th colspan="3" bgcolor="#d0d0d0">Summary</th></tr>
			<tr><td><b>spatialite_version</b></td>
				<td>spatialite_version( void ) : <i>String</i></td>
				<td colspan="3">returns the current <b>SpatiaLite</b> version as a text string</td></tr>
			<tr><td><b>spatialite_target_cpu</b></td>
				<td>spatialite_target_cpu( void ) : <i>String</i></td>
				<td colspan="3">returns the current <b>SpatiaLite</b> Target CPU as a text string</td></tr>
			<tr><td><b>requires_strict_sql_quoting</b></td>
				<td>requires_strict_sql_quoting( void ) : <i>String</i></td>
				<td colspan="3">returns <b>TRUE</b> or<b>FALSE</b> depending on the actual behavior of current <b>SQLite</b>.<br>
				<u><b>Note</b></u>:SQLite can effectively enforce strict SQL quoting (<b>single-quoted</b> text constants and <b>double-quoted</b> table and column names) 
				only since version <b>3.29.0</b>, depending on build-time settings.</td></tr>
			<tr><td><b>freexl_version</b></td>
				<td>freexl_version( void ) : <i>String</i></td>
				<td colspan="3">returns the current <b>FreeXL</b> version as a text string<br>
					or NULL if FreeXL is currently unsupported</td></tr>
................................................................................
			<tr><td><b>RemovePoint</b></td>
				<td>RemovePoint( line <i>LineString</i> , position <i>Integer</i> ) : <i>Linestring</i><hr>
					ST_RemovePoint( line <i>LineString</i> , position <i>Integer</i> ) : <i>Linestring</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>returns a new Linestring by removing the Point at <b>position</b> (zero-based index).<br>
                                <b>NULL</b> will be returned if any error is encountered.</td></tr>




























			<tr><td colspan="5" align="center" bgcolor="#f0f0c0">
				<h3><a name="p8">SQL functions on type Surface [Polygon or Ring]</a></h3></td></tr>
			<tr><th bgcolor="#d0d0d0">Function</th>
				<th bgcolor="#d0d0d0">Syntax</th>
				<th bgcolor="#d0d0d0">OGC<br>defined</th>
				<th bgcolor="#d0d0d0">required<br>module</th>
				<th bgcolor="#d0d0d0">Summary</th></tr>
................................................................................
			<tr><td><b>SplitRight</b></td>
				<td>SplitRight( geom <i>Geometry</i>, blade <i>Geometry</i>  ) : <i>Geometry</i><hr>
					ST_SplitRight( geom <i>Geometry</i> , blade <i>Geometry</i> ) : <i>Geometry</i></td>
				<td></td>
				<td align="center" bgcolor="#f0d0f0">RTTOPO</td>
				<td>return a new Geometry collecting all items resulting by splitting the input Geometry by the <i>blade</i> and falling on the <i>right side</i>.<br>
					NULL is returned on failure (or if the <i>right side</i> is empty).</td></tr>














			<tr><td><b>Azimuth</b></td>
				<td>Azimuth( pt1 <i>Geometry</i>, pt2 <i>Geometry</i>  ) : <i>Double precision</i><hr>
					ST_Azimuth( pt1 <i>Geometry</i> , pt2 <i>Geometry</i> ) : <i>Double precision</i></td>
				<td></td>
				<td align="center" bgcolor="#f0d0f0">RTTOPO</td>
				<td>return the angle (in radians) from the horizontal of the vector defined by <b>pt1</b> and <b>pt2</b>.<br>
                                        Both <b>pt1</b> and <b>pt2</b> are expected to be simple Points.<br>







|
|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>







74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
....
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
....
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
				<th colspan="3" bgcolor="#d0d0d0">Summary</th></tr>
			<tr><td><b>spatialite_version</b></td>
				<td>spatialite_version( void ) : <i>String</i></td>
				<td colspan="3">returns the current <b>SpatiaLite</b> version as a text string</td></tr>
			<tr><td><b>spatialite_target_cpu</b></td>
				<td>spatialite_target_cpu( void ) : <i>String</i></td>
				<td colspan="3">returns the current <b>SpatiaLite</b> Target CPU as a text string</td></tr>
			<tr><td><b>check_strict_sql_quoting</b></td>
				<td>rcheck_strict_sql_quoting( void ) : <i>String</i></td>
				<td colspan="3">returns <b>TRUE</b> or<b>FALSE</b> depending on the actual behavior of current <b>SQLite</b>.<br>
				<u><b>Note</b></u>:SQLite can effectively enforce strict SQL quoting (<b>single-quoted</b> text constants and <b>double-quoted</b> table and column names) 
				only since version <b>3.29.0</b>, depending on build-time settings.</td></tr>
			<tr><td><b>freexl_version</b></td>
				<td>freexl_version( void ) : <i>String</i></td>
				<td colspan="3">returns the current <b>FreeXL</b> version as a text string<br>
					or NULL if FreeXL is currently unsupported</td></tr>
................................................................................
			<tr><td><b>RemovePoint</b></td>
				<td>RemovePoint( line <i>LineString</i> , position <i>Integer</i> ) : <i>Linestring</i><hr>
					ST_RemovePoint( line <i>LineString</i> , position <i>Integer</i> ) : <i>Linestring</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>returns a new Linestring by removing the Point at <b>position</b> (zero-based index).<br>
                                <b>NULL</b> will be returned if any error is encountered.</td></tr>
			<tr><td><b>LinestringMinSegmentLength</b></td>
				<td>LinestringMinSegmentLength( line <i>LineString</i> ) : <i>Double precision</i><hr>
					LinestringMinSegmentLength( line <i>LineString</i> , boolean <i>ignore_repeated_vertices</i> ) : <i>Double precision</i><hr>
					ST_LinestringMinSegmentLength( line <i>LineString</i> ) : <i>Double precision</i><hr>
					ST_LinestringMinSegmentLength( line <i>LineString</i> , boolean <i>ignore_repeated_vertices</i> ) : <i>Double precision</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td><ul><li>any eventual repeated vertex will be ignored or considered accordingly to the seeting of the optional argument <b>ignore_repeated_vertices</b><br>
					The default setting is <b>TRUE</b> (that is, ignore)</nr></li></ul>
					returns the length of the shortest segment in the Linestring.<br>
                                <b>NULL</b> will be returned if any error is encountered.<hr>
                                <b>Note</b>: this function only accepts simple Linestrings; Geometries containing any Point or Polygon, or containing more than a single Linesting will be considered invalid.</td></tr>
			<tr><td><b>LinestringMaxSegmentLength</b></td>
				<td>LinestringMaxSegmentLength( line <i>LineString</i> ) : <i>Double precision</i><hr>
					ST_LinestringMaxSegmentLength( line <i>LineString</i> ) : <i>Double precision</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>returns the length of the longest segment in the Linestring.<br>
                                <b>NULL</b> will be returned if any error is encountered.<hr>
                                <b>Note</b>: this function only accepts simple Linestrings; Geometries containing any Point or Polygon, or containing more than a single Linesting will be considered invalid.</td></tr>
			<tr><td><b>LinestringAvgSegmentLength</b></td>
				<td>LinestringAvgSegmentLength( line <i>LineString</i> ) : <i>Double precision</i><hr>
					ST_LinestringAvgSegmentLength( line <i>LineString</i> ) : <i>Double precision</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>returns the average length of segments in the Linestring.<br>
                                <b>NULL</b> will be returned if any error is encountered.<hr>
                                <b>Note</b>: this function only accepts simple Linestrings; Geometries containing any Point or Polygon, or containing more than a single Linesting will be considered invalid.</td></tr>
			<tr><td colspan="5" align="center" bgcolor="#f0f0c0">
				<h3><a name="p8">SQL functions on type Surface [Polygon or Ring]</a></h3></td></tr>
			<tr><th bgcolor="#d0d0d0">Function</th>
				<th bgcolor="#d0d0d0">Syntax</th>
				<th bgcolor="#d0d0d0">OGC<br>defined</th>
				<th bgcolor="#d0d0d0">required<br>module</th>
				<th bgcolor="#d0d0d0">Summary</th></tr>
................................................................................
			<tr><td><b>SplitRight</b></td>
				<td>SplitRight( geom <i>Geometry</i>, blade <i>Geometry</i>  ) : <i>Geometry</i><hr>
					ST_SplitRight( geom <i>Geometry</i> , blade <i>Geometry</i> ) : <i>Geometry</i></td>
				<td></td>
				<td align="center" bgcolor="#f0d0f0">RTTOPO</td>
				<td>return a new Geometry collecting all items resulting by splitting the input Geometry by the <i>blade</i> and falling on the <i>right side</i>.<br>
					NULL is returned on failure (or if the <i>right side</i> is empty).</td></tr>
			<tr><td><b>SnapAndSplit</b></td>
				<td>SnapAndSplit( geom1 <i>Geometry</i> , geom2 <i>Geometry</i> , tolerance <i>Double precision</i> ) : <i>Geometry</i><hr>
					ST_SnapAndSplit( geom1 <i>Geometry</i> , geom2 <i>Geometry</i> , tolerance <i>Double precision</i> ) : <i>Geometry</i></td>
				<td></td>
				<td align="center" bgcolor="#f0d0f0">RTTOPO</td>
				<td>This one simply is a <i>convenience function</i> accepting the same arguments of <b>ST_Snap()</b> (with identical meaning).
					<ul>
						<li><b>geom1</b> is expected to be a <b>LINESTRING</b> or a <b>MULTILINESTRING</b></li>
						<li><b>geom2</b> is expected to be a <b>POINT</b> or a <b>MULTIPOINT</b></li>
						<li>first pass: <b>geom1</b> will be snapped against <b>geom2</b></li>
						<li>second pass: the resulting geometry returned by the above <b>snap</b> will then be <b>split</b> using <b>geom2</b> as the cutting blade.</li>
						<li>the final result returned by <b>SnapAndSplit</b> will always be a <b>MULTILINESTRING</b></li>
					</ul>
					NULL is returned for invalid arguments</td></tr>
			<tr><td><b>Azimuth</b></td>
				<td>Azimuth( pt1 <i>Geometry</i>, pt2 <i>Geometry</i>  ) : <i>Double precision</i><hr>
					ST_Azimuth( pt1 <i>Geometry</i> , pt2 <i>Geometry</i> ) : <i>Double precision</i></td>
				<td></td>
				<td align="center" bgcolor="#f0d0f0">RTTOPO</td>
				<td>return the angle (in radians) from the horizontal of the vector defined by <b>pt1</b> and <b>pt2</b>.<br>
                                        Both <b>pt1</b> and <b>pt2</b> are expected to be simple Points.<br>

Changes to src/gaiageo/gg_geometries.c.

4802
4803
4804
4805
4806
4807
4808
4809
4810


4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821

4822
4823
4824
4825
4826
4827
4828
4829
	  else
	    {
		gaiaGetPointXYZM (pL->Coords, iv, &x, &y, &z, &m);
	    }

	  if (iv != 0)
	    {
		progressive_length +=
		    sqrt (((x0 - x) * (x0 - x)) + ((y0 - y) * (y0 - y)));


		if (progressive_length == normalized_len)
		  {
		      /* special case: exactly intercepting a vertex */
		      *m_value = m;
		      return 1;
		  }
		if (progressive_length > normalized_len)
		  {
		      /* interpolating the M-Value */
		      double interval = m - m0;
		      double diff = fraction - pl0;

		      *m_value = m0 + (interval * diff);
		      break;
		  }
	    }
	  x0 = x;
	  y0 = y;
	  m0 = m;
	  pl0 = progressive_length;







|

>
>










|
>
|







4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
	  else
	    {
		gaiaGetPointXYZM (pL->Coords, iv, &x, &y, &z, &m);
	    }

	  if (iv != 0)
	    {
		double length =
		    sqrt (((x0 - x) * (x0 - x)) + ((y0 - y) * (y0 - y)));
		progressive_length += length;

		if (progressive_length == normalized_len)
		  {
		      /* special case: exactly intercepting a vertex */
		      *m_value = m;
		      return 1;
		  }
		if (progressive_length > normalized_len)
		  {
		      /* interpolating the M-Value */
		      double interval = m - m0;
		      double diff = normalized_len - pl0;
		      double ratio = diff / length;
		      *m_value = m0 + (interval * ratio);
		      break;
		  }
	    }
	  x0 = x;
	  y0 = y;
	  m0 = m;
	  pl0 = progressive_length;

Changes to src/spatialite/spatialite.c.

139
140
141
142
143
144
145




146
147
148
149
150
151
152
...
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
.....
23876
23877
23878
23879
23880
23881
23882






























































































































































23883
23884
23885
23886
23887
23888
23889
.....
29755
29756
29757
29758
29759
29760
29761






























































































































29762
29763
29764
29765
29766
29767
29768
.....
46146
46147
46148
46149
46150
46151
46152
46153
46154
46155
46156
46157
46158
46159
46160
46161
46162
.....
49559
49560
49561
49562
49563
49564
49565
























49566
49567
49568
49569
49570
49571
49572
.....
50135
50136
50137
50138
50139
50140
50141






50142
50143
50144
50145
50146
50147
50148
#else
#define FRMT64 "%lld"
#define FRMT64_WO_PCT "lld"
#endif

#define GAIA_UNUSED() if (argc || argv) argc = argc;





struct gaia_geom_chain_item
{
/* a struct used to store a chain item */
    gaiaGeomCollPtr geom;
    struct gaia_geom_chain_item *next;
};

................................................................................
    sql = sqlite3_mprintf ("DROP TABLE IF EXISTS %Q", table);
    sqlite3_exec (sqlite, sql, NULL, NULL, NULL);
    sqlite3_free (table);
    return ok;
}

static void
fnct_requires_strict_sql_quoting (sqlite3_context * context, int argc,
				  sqlite3_value ** argv)
{
/* SQL function:
/ requires_strict_sql_quoting()
/
/ return TRUE of FALSE depending on SQLite3 supporting the DQS misfeature or not
*/
    int ret;
    sqlite3 *sqlite = sqlite3_context_db_handle (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    ret = do_check_dqs (sqlite);
................................................................................
/ Please note: starting since 4.0.0 this function will ignore
/ any Linestring (only Polygons will be considered)
/
*/
    void *data = sqlite3_user_data (context);
    length_common (data, context, argc, argv, 1);
}































































































































































#ifdef ENABLE_RTTOPO		/* only if RTTOPO is enabled */

static void
fnct_3dLength (sqlite3_context * context, int argc, sqlite3_value ** argv)
{
/* SQL function:
................................................................................
					    gpkg_mode, tiny_point);
		sqlite3_result_blob (context, p_result, len, free);
		gaiaFreeGeomColl (result);
	    }
      }
    gaiaFreeGeomColl (geo);
}































































































































static void
fnct_Split (sqlite3_context * context, int argc, sqlite3_value ** argv)
{
/* SQL function:
/ Split(BLOBencoded input, BLOBencoded blade)
/
................................................................................
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_version, 0, 0, 0);
#endif

    sqlite3_create_function_v2 (db, "spatialite_target_cpu", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_target_cpu, 0, 0, 0);
    sqlite3_create_function_v2 (db, "requires_strict_sql_quoting", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_requires_strict_sql_quoting, 0, 0, 0);
    sqlite3_create_function_v2 (db, "freexl_version", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_freexl_version, 0, 0, 0);
    sqlite3_create_function_v2 (db, "proj4_version", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_proj4_version, 0, 0, 0);
    sqlite3_create_function_v2 (db, "proj_version", 0,
................................................................................
				fnct_Perimeter, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Perimeter", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Perimeter, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Perimeter", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Perimeter, 0, 0, 0);
























    sqlite3_create_function_v2 (db, "Area", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Area, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Area", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Area, 0, 0, 0);
    sqlite3_create_function_v2 (db, "Circularity", 1,
................................................................................
				fnct_SplitLeft, 0, 0, 0);
    sqlite3_create_function_v2 (db, "SplitRight", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SplitRight, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_SplitRight", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SplitRight, 0, 0, 0);






    sqlite3_create_function_v2 (db, "ST_Node", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Node, 0, 0, 0);
    sqlite3_create_function_v2 (db, "SelfIntersections", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SelfIntersections, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_SelfIntersections", 1,







>
>
>
>







 







|
|


|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







|

|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>







139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
...
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
.....
23880
23881
23882
23883
23884
23885
23886
23887
23888
23889
23890
23891
23892
23893
23894
23895
23896
23897
23898
23899
23900
23901
23902
23903
23904
23905
23906
23907
23908
23909
23910
23911
23912
23913
23914
23915
23916
23917
23918
23919
23920
23921
23922
23923
23924
23925
23926
23927
23928
23929
23930
23931
23932
23933
23934
23935
23936
23937
23938
23939
23940
23941
23942
23943
23944
23945
23946
23947
23948
23949
23950
23951
23952
23953
23954
23955
23956
23957
23958
23959
23960
23961
23962
23963
23964
23965
23966
23967
23968
23969
23970
23971
23972
23973
23974
23975
23976
23977
23978
23979
23980
23981
23982
23983
23984
23985
23986
23987
23988
23989
23990
23991
23992
23993
23994
23995
23996
23997
23998
23999
24000
24001
24002
24003
24004
24005
24006
24007
24008
24009
24010
24011
24012
24013
24014
24015
24016
24017
24018
24019
24020
24021
24022
24023
24024
24025
24026
24027
24028
24029
24030
24031
24032
24033
24034
24035
24036
24037
24038
24039
24040
24041
24042
24043
24044
24045
24046
24047
24048
24049
24050
24051
.....
29917
29918
29919
29920
29921
29922
29923
29924
29925
29926
29927
29928
29929
29930
29931
29932
29933
29934
29935
29936
29937
29938
29939
29940
29941
29942
29943
29944
29945
29946
29947
29948
29949
29950
29951
29952
29953
29954
29955
29956
29957
29958
29959
29960
29961
29962
29963
29964
29965
29966
29967
29968
29969
29970
29971
29972
29973
29974
29975
29976
29977
29978
29979
29980
29981
29982
29983
29984
29985
29986
29987
29988
29989
29990
29991
29992
29993
29994
29995
29996
29997
29998
29999
30000
30001
30002
30003
30004
30005
30006
30007
30008
30009
30010
30011
30012
30013
30014
30015
30016
30017
30018
30019
30020
30021
30022
30023
30024
30025
30026
30027
30028
30029
30030
30031
30032
30033
30034
30035
30036
30037
30038
30039
30040
30041
30042
30043
30044
30045
30046
30047
30048
30049
30050
30051
30052
30053
30054
30055
30056
.....
46434
46435
46436
46437
46438
46439
46440
46441
46442
46443
46444
46445
46446
46447
46448
46449
46450
.....
49847
49848
49849
49850
49851
49852
49853
49854
49855
49856
49857
49858
49859
49860
49861
49862
49863
49864
49865
49866
49867
49868
49869
49870
49871
49872
49873
49874
49875
49876
49877
49878
49879
49880
49881
49882
49883
49884
.....
50447
50448
50449
50450
50451
50452
50453
50454
50455
50456
50457
50458
50459
50460
50461
50462
50463
50464
50465
50466
#else
#define FRMT64 "%lld"
#define FRMT64_WO_PCT "lld"
#endif

#define GAIA_UNUSED() if (argc || argv) argc = argc;

#define LINESTRING_MIN_SEGMENT_LENGTH	1
#define LINESTRING_MAX_SEGMENT_LENGTH	2
#define LINESTRING_AVG_SEGMENT_LENGTH	3

struct gaia_geom_chain_item
{
/* a struct used to store a chain item */
    gaiaGeomCollPtr geom;
    struct gaia_geom_chain_item *next;
};

................................................................................
    sql = sqlite3_mprintf ("DROP TABLE IF EXISTS %Q", table);
    sqlite3_exec (sqlite, sql, NULL, NULL, NULL);
    sqlite3_free (table);
    return ok;
}

static void
fnct_check_strict_sql_quoting (sqlite3_context * context, int argc,
			       sqlite3_value ** argv)
{
/* SQL function:
/ check_strict_sql_quoting()
/
/ return TRUE of FALSE depending on SQLite3 supporting the DQS misfeature or not
*/
    int ret;
    sqlite3 *sqlite = sqlite3_context_db_handle (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    ret = do_check_dqs (sqlite);
................................................................................
/ Please note: starting since 4.0.0 this function will ignore
/ any Linestring (only Polygons will be considered)
/
*/
    void *data = sqlite3_user_data (context);
    length_common (data, context, argc, argv, 1);
}

static void
linestring_segment_length_common (sqlite3_context * context, int argc,
				  sqlite3_value ** argv, int mode)
{
/* common implementation supporting LinestringXxxSegmentLenght */
    unsigned char *p_blob;
    int n_bytes;
    int ignore_repeated_vertices = 1;
    int iv;
    double x;
    double y;
    double z;
    double m;
    double last_x;
    double last_y;
    double min = DBL_MAX;
    double max = 0.0;
    double tot = 0.0;
    int n = 0;
    gaiaLinestringPtr ln;
    gaiaGeomCollPtr geo = NULL;
    int gpkg_amphibious = 0;
    int gpkg_mode = 0;
    struct splite_internal_cache *cache = sqlite3_user_data (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    if (cache != NULL)
      {
	  gpkg_amphibious = cache->gpkg_amphibious_mode;
	  gpkg_mode = cache->gpkg_mode;
      }
    if (sqlite3_value_type (argv[0]) != SQLITE_BLOB)
      {
	  sqlite3_result_null (context);
	  return;
      }
    if (argc == 2)
      {
	  if (sqlite3_value_type (argv[1]) != SQLITE_INTEGER)
	    {
		sqlite3_result_null (context);
		return;
	    }
	  ignore_repeated_vertices = sqlite3_value_int (argv[1]);
      }
    p_blob = (unsigned char *) sqlite3_value_blob (argv[0]);
    n_bytes = sqlite3_value_bytes (argv[0]);
    geo =
	gaiaFromSpatiaLiteBlobWkbEx (p_blob, n_bytes, gpkg_mode,
				     gpkg_amphibious);
    if (!geo)
      {
	  sqlite3_result_null (context);
	  return;
      }
    if (!is_single_linestring (geo))
      {
	  gaiaFreeGeomColl (geo);
	  sqlite3_result_null (context);
	  return;
      }

    ln = geo->FirstLinestring;
    for (iv = 0; iv < ln->Points; iv++)
      {
	  if (geo->DimensionModel == GAIA_XY_Z)
	    {
		gaiaGetPointXYZ (ln->Coords, iv, &x, &y, &z);
	    }
	  else if (geo->DimensionModel == GAIA_XY_M)
	    {
		gaiaGetPointXYM (ln->Coords, iv, &x, &y, &m);
	    }
	  else if (geo->DimensionModel == GAIA_XY_Z_M)
	    {
		gaiaGetPointXYZM (ln->Coords, iv, &x, &y, &z, &m);
	    }
	  else
	    {
		gaiaGetPoint (ln->Coords, iv, &x, &y);
	    }
	  if (iv > 0)
	    {
		int ok = 1;
		if (ignore_repeated_vertices)
		  {
		      if (last_x == x && last_y == y)
			  ok = 0;
		  }
		if (ok)
		  {
		      double l =
			  sqrt (((last_x - x) * (last_x - x)) +
				((last_y - y) * (last_y - y)));
		      if (l < min)
			  min = l;
		      if (l > max)
			  max = l;
		      tot += l;
		      n++;
		  }
	    }
	  last_x = x;
	  last_y = y;
      }
    if (mode == LINESTRING_MIN_SEGMENT_LENGTH)
	sqlite3_result_double (context, min);
    else if (mode == LINESTRING_MAX_SEGMENT_LENGTH)
	sqlite3_result_double (context, max);
    else
	sqlite3_result_double (context, tot / (double) n);
}

static void
fnct_LinestringMinSegmentLength (sqlite3_context * context, int argc,
				 sqlite3_value ** argv)
{
/* SQL function:
/ ST_LinestringMinSegmentLength(BLOB encoded LINESTRING)
/ ST_LinestringMinSegmentLength(BLOB encoded LINESTRING, BOOL ignore_repeated_vertices)
/
/ returns  the length of the shortest segment in the Linestring
/ or NULL if any error is encountered
/
*/
    linestring_segment_length_common (context, argc, argv,
				      LINESTRING_MIN_SEGMENT_LENGTH);
}

static void
fnct_LinestringMaxSegmentLength (sqlite3_context * context, int argc,
				 sqlite3_value ** argv)
{
/* SQL function:
/ ST_LinsetringMaxSegmentLength(BLOB encoded LINESTRING)
/
/ returns  the length of the longest segment in the Linstring
/ or NULL if any error is encountered
/
*/
    linestring_segment_length_common (context, argc, argv,
				      LINESTRING_MAX_SEGMENT_LENGTH);
}

static void
fnct_LinestringAvgSegmentLength (sqlite3_context * context, int argc,
				 sqlite3_value ** argv)
{
/* SQL function:
/ ST_LinestringMaxSegmentLength(BLOB encoded LINESTRING)
/
/ returns  the average segment length in the Linstring
/ or NULL if any error is encountered
/
*/
    linestring_segment_length_common (context, argc, argv,
				      LINESTRING_AVG_SEGMENT_LENGTH);
}

#ifdef ENABLE_RTTOPO		/* only if RTTOPO is enabled */

static void
fnct_3dLength (sqlite3_context * context, int argc, sqlite3_value ** argv)
{
/* SQL function:
................................................................................
					    gpkg_mode, tiny_point);
		sqlite3_result_blob (context, p_result, len, free);
		gaiaFreeGeomColl (result);
	    }
      }
    gaiaFreeGeomColl (geo);
}

static int
is_line (gaiaGeomCollPtr geom)
{
/* checking for a Linestring or MultiLinestring */
    if (geom->FirstPoint != NULL || geom->FirstPolygon != NULL)
	return 0;
    if (geom->FirstLinestring != NULL)
	return 1;
    return 0;
}

static int
is_point_blade (gaiaGeomCollPtr geom)
{
/* checking for a Point or MultiPoint */
    if (geom->FirstLinestring != NULL || geom->FirstPolygon != NULL)
	return 0;
    if (geom->FirstPoint != NULL)
	return 1;
    return 0;
}

static void
fnct_SnapAndSplit (sqlite3_context * context, int argc, sqlite3_value ** argv)
{
/* SQL function:
/ SnapAndSplit(BLOBencoded geometry1, BLOBencoded geometry2, double tolerance)
/
/ - geometry1 is expected to be a LINESTRING or MULTILINESTRING
/ - geometry2 is expected to be a MULTIPOINT
/ - in a first pass geometry1 will be snapped against geometry2
/ - then the intermediate result of Snap will be Split using
/   geometry2 as the cutting blade.
/ .- 
/ Returns a new Geometry of the MULTILINESTRING type
/ NULL is returned for invalid arguments
*/
    unsigned char *p_blob;
    int n_bytes;
    int int_value;
    double tolerance;
    gaiaGeomCollPtr geo1 = NULL;
    gaiaGeomCollPtr geo2 = NULL;
    gaiaGeomCollPtr result_snap;
    gaiaGeomCollPtr result_split;
    int gpkg_amphibious = 0;
    int gpkg_mode = 0;
    int tiny_point = 0;
    struct splite_internal_cache *cache = sqlite3_user_data (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    if (cache != NULL)
      {
	  gpkg_amphibious = cache->gpkg_amphibious_mode;
	  gpkg_mode = cache->gpkg_mode;
	  tiny_point = cache->tinyPointEnabled;
      }
    if (sqlite3_value_type (argv[0]) != SQLITE_BLOB)
      {
	  sqlite3_result_null (context);
	  return;
      }
    if (sqlite3_value_type (argv[1]) != SQLITE_BLOB)
      {
	  sqlite3_result_null (context);
	  return;
      }
    if (sqlite3_value_type (argv[2]) == SQLITE_FLOAT)
	tolerance = sqlite3_value_double (argv[2]);
    else if (sqlite3_value_type (argv[2]) == SQLITE_INTEGER)
      {
	  int_value = sqlite3_value_int (argv[2]);
	  tolerance = int_value;
      }
    else
      {
	  sqlite3_result_null (context);
	  return;
      }
    p_blob = (unsigned char *) sqlite3_value_blob (argv[0]);
    n_bytes = sqlite3_value_bytes (argv[0]);
    geo1 =
	gaiaFromSpatiaLiteBlobWkbEx (p_blob, n_bytes, gpkg_mode,
				     gpkg_amphibious);
    p_blob = (unsigned char *) sqlite3_value_blob (argv[1]);
    n_bytes = sqlite3_value_bytes (argv[1]);
    geo2 =
	gaiaFromSpatiaLiteBlobWkbEx (p_blob, n_bytes, gpkg_mode,
				     gpkg_amphibious);
    if (geo1 == NULL || geo2 == NULL)
	sqlite3_result_null (context);
    else if (is_line (geo1) == 0)
	sqlite3_result_null (context);
    else if (is_point_blade (geo2) == 0)
	sqlite3_result_null (context);
    else
      {
	  void *data = sqlite3_user_data (context);
	  if (data != NULL)
	      result_snap = gaiaSnap_r (data, geo1, geo2, tolerance);
	  else
	      result_snap = gaiaSnap (geo1, geo2, tolerance);
	  if (result_snap == NULL)
	      sqlite3_result_null (context);
	  else
	    {
		result_split = gaiaSplit (cache, result_snap, geo2);
		gaiaFreeGeomColl (result_snap);
		if (result_split == NULL)
		    sqlite3_result_null (context);
		else
		  {
		      /* builds the BLOB geometry to be returned */
		      int len;
		      unsigned char *p_result = NULL;
		      result_split->Srid = geo1->Srid;
		      gaiaToSpatiaLiteBlobWkbEx2 (result_split, &p_result, &len,
						  gpkg_mode, tiny_point);
		      sqlite3_result_blob (context, p_result, len, free);
		      gaiaFreeGeomColl (result_split);
		  }
	    }
      }
    gaiaFreeGeomColl (geo1);
    gaiaFreeGeomColl (geo2);
}

static void
fnct_Split (sqlite3_context * context, int argc, sqlite3_value ** argv)
{
/* SQL function:
/ Split(BLOBencoded input, BLOBencoded blade)
/
................................................................................
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_version, 0, 0, 0);
#endif

    sqlite3_create_function_v2 (db, "spatialite_target_cpu", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_target_cpu, 0, 0, 0);
    sqlite3_create_function_v2 (db, "check_strict_sql_quoting", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_check_strict_sql_quoting, 0, 0, 0);
    sqlite3_create_function_v2 (db, "freexl_version", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_freexl_version, 0, 0, 0);
    sqlite3_create_function_v2 (db, "proj4_version", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_proj4_version, 0, 0, 0);
    sqlite3_create_function_v2 (db, "proj_version", 0,
................................................................................
				fnct_Perimeter, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Perimeter", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Perimeter, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Perimeter", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Perimeter, 0, 0, 0);
    sqlite3_create_function_v2 (db, "LinestringMinSegmentLength", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringMinSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_LinestringMinSegmentLength", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringMinSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "LinestringMinSegmentLength", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringMinSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_LinestringMinSegmentLength", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringMinSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "LinestringMaxSegmentLength", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringMaxSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_LinestringMaxSegmentLength", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringMaxSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "LinestringAvgSegmentLength", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringAvgSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_LinestringAvgSegmentLength", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_LinestringAvgSegmentLength, 0, 0, 0);
    sqlite3_create_function_v2 (db, "Area", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Area, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Area", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Area, 0, 0, 0);
    sqlite3_create_function_v2 (db, "Circularity", 1,
................................................................................
				fnct_SplitLeft, 0, 0, 0);
    sqlite3_create_function_v2 (db, "SplitRight", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SplitRight, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_SplitRight", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SplitRight, 0, 0, 0);
    sqlite3_create_function_v2 (db, "SnapAndSplit", 3,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SnapAndSplit, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_SnapAndSplit", 3,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SnapAndSplit, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_Node", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_Node, 0, 0, 0);
    sqlite3_create_function_v2 (db, "SelfIntersections", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_SelfIntersections, 0, 0, 0);
    sqlite3_create_function_v2 (db, "ST_SelfIntersections", 1,

Changes to test/elba-sezcen.sqlite.

cannot compute difference between binary files

Changes to test/sql_stmt_rtgeom_tests/Makefile.am.

80
81
82
83
84
85
86

















87
88
89
90
91
92
93
	maxdistance3.testcase \
	maxdistance4.testcase \
	maxdistance5.testcase \
	maxdistance6.testcase \
	maxdistance7.testcase \
	maxdistance8.testcase \
	maxdistance9.testcase \

















	st_asx3d10.testcase \
	st_asx3d11.testcase \
	st_asx3d12.testcase \
	st_asx3d13.testcase \
	st_asx3d14.testcase \
	st_asx3d15.testcase \
	st_asx3d16.testcase \







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
	maxdistance3.testcase \
	maxdistance4.testcase \
	maxdistance5.testcase \
	maxdistance6.testcase \
	maxdistance7.testcase \
	maxdistance8.testcase \
	maxdistance9.testcase \
	snapsplit1.testcase \
	snapsplit2.testcase \
	snapsplit3.testcase \
	snapsplit4.testcase \
	snapsplit5.testcase \
	snapsplit6.testcase \
	snapsplit7.testcase \
	snapsplit8.testcase \
	snapsplit9.testcase \
	snapsplit10.testcase \
	snapsplit11.testcase \
	snapsplit12.testcase \
	snapsplit13.testcase \
	snapsplit14.testcase \
	snapsplit15.testcase \
	snapsplit16.testcase \
	snapsplit17.testcase \
	st_asx3d10.testcase \
	st_asx3d11.testcase \
	st_asx3d12.testcase \
	st_asx3d13.testcase \
	st_asx3d14.testcase \
	st_asx3d15.testcase \
	st_asx3d16.testcase \

Changes to test/sql_stmt_rtgeom_tests/Makefile.in.

332
333
334
335
336
337
338

















339
340
341
342
343
344
345
	maxdistance3.testcase \
	maxdistance4.testcase \
	maxdistance5.testcase \
	maxdistance6.testcase \
	maxdistance7.testcase \
	maxdistance8.testcase \
	maxdistance9.testcase \

















	st_asx3d10.testcase \
	st_asx3d11.testcase \
	st_asx3d12.testcase \
	st_asx3d13.testcase \
	st_asx3d14.testcase \
	st_asx3d15.testcase \
	st_asx3d16.testcase \







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
	maxdistance3.testcase \
	maxdistance4.testcase \
	maxdistance5.testcase \
	maxdistance6.testcase \
	maxdistance7.testcase \
	maxdistance8.testcase \
	maxdistance9.testcase \
	snapsplit1.testcase \
	snapsplit2.testcase \
	snapsplit3.testcase \
	snapsplit4.testcase \
	snapsplit5.testcase \
	snapsplit6.testcase \
	snapsplit7.testcase \
	snapsplit8.testcase \
	snapsplit9.testcase \
	snapsplit10.testcase \
	snapsplit11.testcase \
	snapsplit12.testcase \
	snapsplit13.testcase \
	snapsplit14.testcase \
	snapsplit15.testcase \
	snapsplit16.testcase \
	snapsplit17.testcase \
	st_asx3d10.testcase \
	st_asx3d11.testcase \
	st_asx3d12.testcase \
	st_asx3d13.testcase \
	st_asx3d14.testcase \
	st_asx3d15.testcase \
	st_asx3d16.testcase \

Added test/sql_stmt_rtgeom_tests/snapsplit1.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, NULL LINESTRING
:memory: #use in-memory database
SELECT SnapAndSplit(NULL, GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(NULL, GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit10.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, NULL Tolerance
:memory: #use in-memory database
SELECT SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), NULL);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), NULL)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit11.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, TEXT Tolerance
:memory: #use in-memory database
SELECT SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), '0.1');
1 # rows (not including the header row)
1 # columns
SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), '0.1')
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit12.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, INT Tolerance
:memory: #use in-memory database
SELECT AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0));
1 # rows (not including the header row)
1 # columns
AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0))
MULTILINESTRING((0 5, 0 0), (0 0, 5 0), (5 0, 10 0, 10 5), (10 5, 10 10, 5 10), (5 10, 0 10, 0 5))

Added test/sql_stmt_rtgeom_tests/snapsplit13.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, DOUBLE Tolerance
:memory: #use in-memory database
SELECT AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1));
1 # rows (not including the header row)
1 # columns
AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1))
MULTILINESTRING((0 5, 0 0), (0 0, 5 0), (5 0, 10 0, 10 5), (10 5, 10 10, 5 10), (5 10, 0 10, 0 5))

Added test/sql_stmt_rtgeom_tests/snapsplit14.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, POINT first geom
:memory: #use in-memory database
SELECT AsText(SnapAndSplit(GeomFromText('POINT(0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1));
1 # rows (not including the header row)
1 # columns
AsText(SnapAndSplit(GeomFromText('POINT(0 0)', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1))
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit15.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, POLYGON first geom
:memory: #use in-memory database
SELECT AsText(SnapAndSplit(GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1));
1 # rows (not including the header row)
1 # columns
AsText(SnapAndSplit(GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))', 4326), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1))
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit16.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, LINESTRING second geom
:memory: #use in-memory database
SELECT AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('LINESTRING(5 0, 10 5, 5 10,  0 5)', 4326), 0));
1 # rows (not including the header row)
1 # columns
AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('LINESTRING(5 0, 10 5, 5 10,  0 5)', 4326), 0));
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit17.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, POLYGON second geom
:memory: #use in-memory database
SELECT AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('POLYGON((5 0, 10 5, 5 10,  0 5, 5 0))', 4326), 0));
1 # rows (not including the header row)
1 # columns
AsText(SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), GeomFromText('POLYGON((5 0, 10 5, 5 10,  0 5, 5 0))', 4326), 0));
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit2.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, INT LINESTRING
:memory: #use in-memory database
SELECT SnapAndSplit(1, GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(1, GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit3.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, DOUBLE LINESTRING
:memory: #use in-memory database
SELECT SnapAndSplit(1.2, GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(1.2, GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit4.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, TEXT LINESTRING
:memory: #use in-memory database
SELECT SnapAndSplit('line', GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit('line', GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit5.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, invalid BLOB LINESTRING
:memory: #use in-memory database
SELECT SnapAndSplit(zeroblob(10), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(zeroblob(10), GeomFromText('MULTIPOINT(5 0, 10 5, 5 10,  0 5)', 4326), 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit6.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, NULL MULTIPOINT
:memory: #use in-memory database
SELECT SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), NULL, 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), NULL, 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit7.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, INT MULTIPOINT
:memory: #use in-memory database
SELECT SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), 1, 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), 1, 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit8.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, TEXT MULTIPOINT
:memory: #use in-memory database
SELECT SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), 'multipoint', 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), 'multipoint', 0.1)
(NULL)

Added test/sql_stmt_rtgeom_tests/snapsplit9.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
SnapAndSplit, invalid BLOB MULTIPOINT
:memory: #use in-memory database
SELECT SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), zeroblob(10), 0.1);
1 # rows (not including the header row)
1 # columns
SnapAndSplit(GeomFromText('LINESTRING(0 0, 10 0, 10 10, 0 10, 0 0)', 4326), zeroblob(10), 0.1)
(NULL)

Changes to test/sql_stmt_tests/Makefile.

129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
....
1824
1825
1826
1827
1828
1829
1830

































1831
1832
1833
1834
1835
1836
1837
AS = as
AUTOCONF = autoconf
AUTOHEADER = autoheader
AUTOMAKE = automake-1.15
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -Wall -Wextra -Wunused -pedantic -g -O0 -fprofile-arcs -ftest-coverage -g
CPP = gcc -E
CPPFLAGS = 
CXX = g++
CXXCPP = g++ -E
CXXDEPMODE = depmode=gcc3
CXXFLAGS = -g -O2
CYGPATH_W = echo
................................................................................
	linesfromrings1.testcase \
	linesfromrings2.testcase \
	linesfromrings3.testcase \
	linesfromrings4.testcase \
	linesfromrings5.testcase \
	linesfromrings6.testcase \
	linesfromrings7.testcase \

































	link_m.testcase \
	locatemeasure10.testcase \
	locatemeasure11.testcase \
	locatemeasure12.testcase \
	locatemeasure13.testcase \
	locatemeasure14.testcase \
	locatemeasure15.testcase \







|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
....
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
AS = as
AUTOCONF = autoconf
AUTOHEADER = autoheader
AUTOMAKE = automake-1.15
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -g -O2 -fprofile-arcs -ftest-coverage -g
CPP = gcc -E
CPPFLAGS = 
CXX = g++
CXXCPP = g++ -E
CXXDEPMODE = depmode=gcc3
CXXFLAGS = -g -O2
CYGPATH_W = echo
................................................................................
	linesfromrings1.testcase \
	linesfromrings2.testcase \
	linesfromrings3.testcase \
	linesfromrings4.testcase \
	linesfromrings5.testcase \
	linesfromrings6.testcase \
	linesfromrings7.testcase \
	linesegavg1.testcase \
	linesegavg2.testcase \
	linesegavg3.testcase \
	linesegavg4.testcase \
	linesegavg5.testcase \
	linesegavg6.testcase \
	linesegavg7.testcase \
	linesegavg8.testcase \
	linesegavg9.testcase \
	linesegmax1.testcase \
	linesegmax2.testcase \
	linesegmax3.testcase \
	linesegmax4.testcase \
	linesegmax5.testcase \
	linesegmax6.testcase \
	linesegmax7.testcase \
	linesegmax8.testcase \
	linesegmax9.testcase \
	linesegmin1.testcase \
	linesegmin2.testcase \
	linesegmin3.testcase \
	linesegmin4.testcase \
	linesegmin5.testcase \
	linesegmin6.testcase \
	linesegmin7.testcase \
	linesegmin8.testcase \
	linesegmin9.testcase \
	linesegmin10.testcase \
	linesegmin11.testcase \
	linesegmin12.testcase \
	linesegmin13.testcase \
	linesegmin14.testcase \
	linesegmin15.testcase \
	link_m.testcase \
	locatemeasure10.testcase \
	locatemeasure11.testcase \
	locatemeasure12.testcase \
	locatemeasure13.testcase \
	locatemeasure14.testcase \
	locatemeasure15.testcase \

Changes to test/sql_stmt_tests/Makefile.am.

1572
1573
1574
1575
1576
1577
1578

































1579
1580
1581
1582
1583
1584
1585
	linesfromrings1.testcase \
	linesfromrings2.testcase \
	linesfromrings3.testcase \
	linesfromrings4.testcase \
	linesfromrings5.testcase \
	linesfromrings6.testcase \
	linesfromrings7.testcase \

































	link_m.testcase \
	locatemeasure10.testcase \
	locatemeasure11.testcase \
	locatemeasure12.testcase \
	locatemeasure13.testcase \
	locatemeasure14.testcase \
	locatemeasure15.testcase \







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
	linesfromrings1.testcase \
	linesfromrings2.testcase \
	linesfromrings3.testcase \
	linesfromrings4.testcase \
	linesfromrings5.testcase \
	linesfromrings6.testcase \
	linesfromrings7.testcase \
	linesegavg1.testcase \
	linesegavg2.testcase \
	linesegavg3.testcase \
	linesegavg4.testcase \
	linesegavg5.testcase \
	linesegavg6.testcase \
	linesegavg7.testcase \
	linesegavg8.testcase \
	linesegavg9.testcase \
	linesegmax1.testcase \
	linesegmax2.testcase \
	linesegmax3.testcase \
	linesegmax4.testcase \
	linesegmax5.testcase \
	linesegmax6.testcase \
	linesegmax7.testcase \
	linesegmax8.testcase \
	linesegmax9.testcase \
	linesegmin1.testcase \
	linesegmin2.testcase \
	linesegmin3.testcase \
	linesegmin4.testcase \
	linesegmin5.testcase \
	linesegmin6.testcase \
	linesegmin7.testcase \
	linesegmin8.testcase \
	linesegmin9.testcase \
	linesegmin10.testcase \
	linesegmin11.testcase \
	linesegmin12.testcase \
	linesegmin13.testcase \
	linesegmin14.testcase \
	linesegmin15.testcase \
	link_m.testcase \
	locatemeasure10.testcase \
	locatemeasure11.testcase \
	locatemeasure12.testcase \
	locatemeasure13.testcase \
	locatemeasure14.testcase \
	locatemeasure15.testcase \

Changes to test/sql_stmt_tests/Makefile.in.

1824
1825
1826
1827
1828
1829
1830

































1831
1832
1833
1834
1835
1836
1837
	linesfromrings1.testcase \
	linesfromrings2.testcase \
	linesfromrings3.testcase \
	linesfromrings4.testcase \
	linesfromrings5.testcase \
	linesfromrings6.testcase \
	linesfromrings7.testcase \

































	link_m.testcase \
	locatemeasure10.testcase \
	locatemeasure11.testcase \
	locatemeasure12.testcase \
	locatemeasure13.testcase \
	locatemeasure14.testcase \
	locatemeasure15.testcase \







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
	linesfromrings1.testcase \
	linesfromrings2.testcase \
	linesfromrings3.testcase \
	linesfromrings4.testcase \
	linesfromrings5.testcase \
	linesfromrings6.testcase \
	linesfromrings7.testcase \
	linesegavg1.testcase \
	linesegavg2.testcase \
	linesegavg3.testcase \
	linesegavg4.testcase \
	linesegavg5.testcase \
	linesegavg6.testcase \
	linesegavg7.testcase \
	linesegavg8.testcase \
	linesegavg9.testcase \
	linesegmax1.testcase \
	linesegmax2.testcase \
	linesegmax3.testcase \
	linesegmax4.testcase \
	linesegmax5.testcase \
	linesegmax6.testcase \
	linesegmax7.testcase \
	linesegmax8.testcase \
	linesegmax9.testcase \
	linesegmin1.testcase \
	linesegmin2.testcase \
	linesegmin3.testcase \
	linesegmin4.testcase \
	linesegmin5.testcase \
	linesegmin6.testcase \
	linesegmin7.testcase \
	linesegmin8.testcase \
	linesegmin9.testcase \
	linesegmin10.testcase \
	linesegmin11.testcase \
	linesegmin12.testcase \
	linesegmin13.testcase \
	linesegmin14.testcase \
	linesegmin15.testcase \
	link_m.testcase \
	locatemeasure10.testcase \
	locatemeasure11.testcase \
	locatemeasure12.testcase \
	locatemeasure13.testcase \
	locatemeasure14.testcase \
	locatemeasure15.testcase \

Added test/sql_stmt_tests/linesegavg1.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - NULL geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(NULL);
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(NULL)
(NULL)

Added test/sql_stmt_tests/linesegavg2.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - INT geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(1);
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(1)
(NULL)

Added test/sql_stmt_tests/linesegavg3.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - DOUBLE geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(1.5);
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(1.5)
(NULL)

Added test/sql_stmt_tests/linesegavg4.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - TEXT geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength('geom');
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength('geom')
(NULL)

Added test/sql_stmt_tests/linesegavg5.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - invalid BLOB geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(zeroblob(10));
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(zeroblob(10))
(NULL)

Added test/sql_stmt_tests/linesegavg6.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - invalid POINT geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(MakePoint(11, 43, 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(MakePoint(11, 43, 4326))
(NULL)

Added test/sql_stmt_tests/linesegavg7.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - invalid POLYGON geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(GeomFromText('POLYGON((10 43, 11 43, 11 44, 10 44, 10 43))', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(GeomFromText('POLYGON((10 43, 11 43, 11 44, 10 44, 10 43))', 4326))
(NULL)

Added test/sql_stmt_tests/linesegavg8.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - invalid MULTILINESTRING geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(GeomFromText('MULTILINESTRING((10 42, 11 42), (11 44, 14 44))', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(GeomFromText('MULTILINESTRING((10 42, 11 42), (11 44, 14 44))', 4326))
(NULL)

Added test/sql_stmt_tests/linesegavg9.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringAvgSegmentLength - valid LINESTRING geom
:memory: #use in-memory database
SELECT ST_LinestringAvgSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringAvgSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326))
2.0

Added test/sql_stmt_tests/linesegmax1.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - NULL geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(NULL);
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(NULL)
(NULL)

Added test/sql_stmt_tests/linesegmax2.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - INT geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(1);
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(1)
(NULL)

Added test/sql_stmt_tests/linesegmax3.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - DOUBLE geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(1.5);
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(1.5)
(NULL)

Added test/sql_stmt_tests/linesegmax4.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - TEXT geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength('geom');
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength('geom')
(NULL)

Added test/sql_stmt_tests/linesegmax5.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - invalid BLOB geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(zeroblob(10));
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(zeroblob(10))
(NULL)

Added test/sql_stmt_tests/linesegmax6.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - invalid POINT geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(MakePoint(11, 43, 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(MakePoint(11, 43, 4326))
(NULL)

Added test/sql_stmt_tests/linesegmax7.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - invalid POLYGON geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(GeomFromText('POLYGON((10 43, 11 43, 11 44, 10 44, 10 43))', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(GeomFromText('POLYGON((10 43, 11 43, 11 44, 10 44, 10 43))', 4326))
(NULL)

Added test/sql_stmt_tests/linesegmax8.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - invalid MULTILINESTRING geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(GeomFromText('MULTILINESTRING((10 42, 11 42), (11 44, 14 44))', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(GeomFromText('MULTILINESTRING((10 42, 11 42), (11 44, 14 44))', 4326))
(NULL)

Added test/sql_stmt_tests/linesegmax9.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMaxSegmentLength - valid LINESTRING geom
:memory: #use in-memory database
SELECT ST_LinestringMaxSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMaxSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326))
3.0

Added test/sql_stmt_tests/linesegmin1.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - NULL geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(NULL);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(NULL)
(NULL)

Added test/sql_stmt_tests/linesegmin10.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - NULL ignore-repeated
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), NULL);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), NULL)
(NULL)

Added test/sql_stmt_tests/linesegmin11.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - double ignore-repeated
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), 1.5);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), 1.5)
(NULL)

Added test/sql_stmt_tests/linesegmin12.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - text ignore-repeated
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), 'no');
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), 'no')
(NULL)

Added test/sql_stmt_tests/linesegmin13.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - BLOB ignore-repeated
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), zeroblob(4));
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326), zeroblob(4))
(NULL)

Added test/sql_stmt_tests/linesegmin14.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - ignore-repeated FALSE
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 42, 11 44, 14 44)', 4326), 0);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 42, 11 44, 14 44)', 4326), 0)
0.0

Added test/sql_stmt_tests/linesegmin15.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - ignore-repeated TRUE
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 42, 11 44, 14 44)', 4326), 1);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 42, 11 44, 14 44)', 4326), 1)
1.0

Added test/sql_stmt_tests/linesegmin2.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - INT geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(1);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(1)
(NULL)

Added test/sql_stmt_tests/linesegmin3.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - DOUBLE geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(1.5);
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(1.5)
(NULL)

Added test/sql_stmt_tests/linesegmin4.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - TEXT geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength('geom');
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength('geom')
(NULL)

Added test/sql_stmt_tests/linesegmin5.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - invalid BLOB geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(zeroblob(10));
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(zeroblob(10))
(NULL)

Added test/sql_stmt_tests/linesegmin6.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - invalid POINT geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(MakePoint(11, 43, 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(MakePoint(11, 43, 4326))
(NULL)

Added test/sql_stmt_tests/linesegmin7.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - invalid POLYGON geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('POLYGON((10 43, 11 43, 11 44, 10 44, 10 43))', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('POLYGON((10 43, 11 43, 11 44, 10 44, 10 43))', 4326))
(NULL)

Added test/sql_stmt_tests/linesegmin8.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - invalid MULTILINESTRING geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('MULTILINESTRING((10 42, 11 42), (11 44, 14 44))', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('MULTILINESTRING((10 42, 11 42), (11 44, 14 44))', 4326))
(NULL)

Added test/sql_stmt_tests/linesegmin9.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
ST_LinestringMinSegmentLength - valid LINESTRING geom
:memory: #use in-memory database
SELECT ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326));
1 # rows (not including the header row)
1 # columns
ST_LinestringMinSegmentLength(GeomFromText('LINESTRING(10 42, 11 42, 11 44, 14 44)', 4326))
1.0