@@ -2149,6 +2149,69 @@ longlong Item_func_issimple::val_int()
2149
2149
}
2150
2150
2151
2151
2152
+ String *Item_func_simplify::val_str (String *str)
2153
+ {
2154
+ DBUG_ENTER (" Item_func_simplify::val_str" );
2155
+ String *res= args[0 ]->val_str (&tmp_value);
2156
+ double max_distance= (double ) args[1 ]->val_real ();
2157
+ Geometry_buffer buffer;
2158
+ Geometry *geometry;
2159
+ uint32 num_points;
2160
+
2161
+ null_value= 1 ;
2162
+ if ((null_value= (args[0 ]->null_value || args[1 ]->null_value )) ||
2163
+ !(geometry= Geometry::construct (&buffer, res->ptr (), res->length ())))
2164
+ {
2165
+ null_value= 1 ;
2166
+ DBUG_RETURN (NULL );
2167
+ }
2168
+
2169
+ if (max_distance <= 0 )
2170
+ {
2171
+ my_error (ER_WRONG_ARGUMENTS, MYF (0 ), func_name ());
2172
+ null_value= 1 ;
2173
+ DBUG_RETURN (NULL );
2174
+ }
2175
+
2176
+ uint32 srid= uint4korr (res->ptr ());
2177
+ if (srid != 0 )
2178
+ {
2179
+ my_error (ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS, MYF (0 ), func_name ());
2180
+ null_value= 1 ;
2181
+ DBUG_RETURN (NULL );
2182
+ }
2183
+
2184
+ if (geometry->get_class_info ()->m_type_id == Geometry::wkb_point ||
2185
+ geometry->get_class_info ()->m_type_id == Geometry::wkb_multipoint)
2186
+ {
2187
+ str = res;
2188
+ DBUG_RETURN (str);
2189
+ }
2190
+
2191
+ if (geometry->get_class_info ()->m_type_id == Geometry::wkb_linestring)
2192
+ {
2193
+ if (geometry->num_points (&num_points))
2194
+ {
2195
+ null_value= 1 ;
2196
+ DBUG_RETURN (NULL );
2197
+ }
2198
+
2199
+ if (num_points < 3 )
2200
+ {
2201
+ str = res;
2202
+ DBUG_RETURN (str);
2203
+ }
2204
+ }
2205
+
2206
+ if (geometry->simplify (str, max_distance))
2207
+ {
2208
+ null_value= 1 ;
2209
+ DBUG_RETURN (NULL );
2210
+ }
2211
+ DBUG_RETURN (str);
2212
+ }
2213
+
2214
+
2152
2215
longlong Item_func_isclosed::val_int ()
2153
2216
{
2154
2217
DBUG_ASSERT (fixed ());
@@ -4253,6 +4316,22 @@ class Create_func_issimple : public Create_func_arg1
4253
4316
};
4254
4317
4255
4318
4319
+ class Create_func_simplify : public Create_func_arg2
4320
+ {
4321
+ public:
4322
+ Item *create_2_arg (THD *thd, Item *arg1, Item *arg2) override
4323
+ {
4324
+ return new (thd->mem_root ) Item_func_simplify (thd, arg1, arg2);
4325
+ }
4326
+
4327
+ static Create_func_simplify s_singleton;
4328
+
4329
+ protected:
4330
+ Create_func_simplify () = default ;
4331
+ ~Create_func_simplify () override = default ;
4332
+ };
4333
+
4334
+
4256
4335
class Create_func_numgeometries : public Create_func_arg1
4257
4336
{
4258
4337
public:
@@ -4525,6 +4604,7 @@ Create_func_isempty Create_func_isempty::s_singleton;
4525
4604
Create_func_isvalid Create_func_isvalid::s_singleton;
4526
4605
Create_func_isring Create_func_isring::s_singleton;
4527
4606
Create_func_issimple Create_func_issimple::s_singleton;
4607
+ Create_func_simplify Create_func_simplify::s_singleton;
4528
4608
Create_func_mbr_contains Create_func_mbr_contains::s_singleton;
4529
4609
Create_func_mbr_coveredby Create_func_mbr_coveredby::s_singleton;
4530
4610
Create_func_mbr_disjoint Create_func_mbr_disjoint::s_singleton;
@@ -4595,6 +4675,7 @@ static Native_func_registry func_array_geom[] =
4595
4675
{ { STRING_WITH_LEN (" ISVALID" ) }, GEOM_BUILDER (Create_func_isvalid)},
4596
4676
{ { STRING_WITH_LEN (" ISRING" ) }, GEOM_BUILDER (Create_func_isring)},
4597
4677
{ { STRING_WITH_LEN (" ISSIMPLE" ) }, GEOM_BUILDER (Create_func_issimple)},
4678
+ { { STRING_WITH_LEN (" SIMPLIFY" ) }, GEOM_BUILDER (Create_func_simplify)},
4598
4679
{ { STRING_WITH_LEN (" LINEFROMTEXT" ) }, GEOM_BUILDER (Create_func_geometry_from_text)},
4599
4680
{ { STRING_WITH_LEN (" LINEFROMWKB" ) }, GEOM_BUILDER (Create_func_geometry_from_wkb)},
4600
4681
{ { STRING_WITH_LEN (" LINESTRINGFROMTEXT" ) }, GEOM_BUILDER (Create_func_geometry_from_text)},
@@ -4678,6 +4759,7 @@ static Native_func_registry func_array_geom[] =
4678
4759
{ { STRING_WITH_LEN (" ST_ISVALID" ) }, GEOM_BUILDER (Create_func_isvalid)},
4679
4760
{ { STRING_WITH_LEN (" ST_ISRING" ) }, GEOM_BUILDER (Create_func_isring)},
4680
4761
{ { STRING_WITH_LEN (" ST_ISSIMPLE" ) }, GEOM_BUILDER (Create_func_issimple)},
4762
+ { { STRING_WITH_LEN (" ST_SIMPLIFY" ) }, GEOM_BUILDER (Create_func_simplify)},
4681
4763
{ { STRING_WITH_LEN (" ST_LENGTH" ) }, GEOM_BUILDER (Create_func_glength)},
4682
4764
{ { STRING_WITH_LEN (" ST_LINEFROMTEXT" ) }, GEOM_BUILDER (Create_func_geometry_from_text)},
4683
4765
{ { STRING_WITH_LEN (" ST_LINEFROMWKB" ) }, GEOM_BUILDER (Create_func_geometry_from_wkb)},
0 commit comments