Skip to content

Commit b93e8c1

Browse files
MDEV-35102 CREATE TABLE AS SELECT ST_collect ... does not work
Update max_length field during fix_fields to ensure that the column has the correct length during CREATE TABLE. st_collect now returns a geometry type rather than a blob.
1 parent 38cc216 commit b93e8c1

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

mysql-test/main/spatial_utility_function_collect.result

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,16 @@ GEOMETRYCOLLECTION(MULTIPOINT(5 0),MULTIPOINT(6 0))
122122
GEOMETRYCOLLECTION(MULTIPOINT(6 0),GEOMETRYCOLLECTION EMPTY)
123123
GEOMETRYCOLLECTION(GEOMETRYCOLLECTION EMPTY,GEOMETRYCOLLECTION EMPTY)
124124
DROP TABLE simple_table;
125+
#
126+
# MDEV-35102 CREATE TABLE AS SELECT ST_collect ... does not work
127+
#
128+
SELECT ST_astext(ST_collect(( POINTFROMTEXT(' POINT( 4 1 ) ') )));
129+
ST_astext(ST_collect(( POINTFROMTEXT(' POINT( 4 1 ) ') )))
130+
MULTIPOINT(4 1)
131+
CREATE TABLE tb1 AS SELECT (ST_collect(( POINTFROMTEXT(' POINT( 4 1 ) ') )) );
132+
SHOW CREATE TABLE tb1;
133+
Table Create Table
134+
tb1 CREATE TABLE `tb1` (
135+
`(ST_collect(( POINTFROMTEXT(' POINT( 4 1 ) ') )) )` geometry DEFAULT NULL
136+
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
137+
DROP TABLE tb1;

mysql-test/main/spatial_utility_function_collect.test

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,11 @@ PRECEDING AND CURRENT ROW)) AS geocollect FROM simple_table;
189189
# SELECT CAST(ST_COLLECT(geo) AS DECIMAL ) FROM simple_table;
190190

191191
DROP TABLE simple_table;
192+
193+
--echo #
194+
--echo # MDEV-35102 CREATE TABLE AS SELECT ST_collect ... does not work
195+
--echo #
196+
SELECT ST_astext(ST_collect(( POINTFROMTEXT(' POINT( 4 1 ) ') )));
197+
CREATE TABLE tb1 AS SELECT (ST_collect(( POINTFROMTEXT(' POINT( 4 1 ) ') )) );
198+
SHOW CREATE TABLE tb1;
199+
DROP TABLE tb1;

sql/item_sum.cc

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include "sql_parse.h"
3232
#include "sp_head.h"
3333
#include "item_sum.h"
34+
#include "sql_type_geom.h"
3435

3536
/**
3637
Calculate the affordable RAM limit for structures like TREE or Unique
@@ -4775,6 +4776,20 @@ String *Item_func_collect::val_str(String *str)
47754776
}
47764777

47774778

4778-
Item *Item_func_collect::copy_or_same(THD *thd) {
4779+
Item *Item_func_collect::copy_or_same(THD *thd)
4780+
{
47794781
return new (thd->mem_root) Item_func_collect(thd, is_distinct, this);
47804782
}
4783+
4784+
4785+
const Type_handler *Item_func_collect::type_handler() const
4786+
{
4787+
return &type_handler_geometry;
4788+
}
4789+
4790+
4791+
bool Item_func_collect::fix_fields_impl(THD *thd,Item **)
4792+
{
4793+
max_length= UINT_MAX32;
4794+
return FALSE;
4795+
}

sql/item_sum.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2165,8 +2165,7 @@ class Item_func_collect : public Item_sum_str
21652165
{
21662166
return GEOMETRY_COLLECT_FUNC;
21672167
}
2168-
const Type_handler *type_handler() const override
2169-
{ return &type_handler_string; }
2168+
const Type_handler *type_handler() const override;
21702169
String *val_str(String*str) override;
21712170
LEX_CSTRING func_name_cstring() const override
21722171
{
@@ -2181,10 +2180,7 @@ class Item_func_collect : public Item_sum_str
21812180
return true;
21822181
}
21832182

2184-
bool fix_fields_impl(THD *,Item **) override
2185-
{
2186-
return FALSE;
2187-
}
2183+
bool fix_fields_impl(THD *thd,Item **) override;
21882184

21892185
public:
21902186
Item_func_collect(THD *thd, bool is_distinct, Item *item_par);

0 commit comments

Comments
 (0)