mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug #27300:
Geometry fields have a result type string and a special subclass to cater for the differences between them and the base class (just like DATE/TIME). When creating temporary tables for results of functions that return results of type GEOMETRY we must construct fields of the derived class instead of the base class. Fixed by creating a GEOMETRY field (Field_geom) instead of a generic BLOB (Field_blob) in temp tables for the results of GIS functions that have GEOMETRY return type (Item_geometry_func).
This commit is contained in:
@ -769,3 +769,14 @@ create table t1 (g geometry not null);
|
|||||||
insert into t1 values(default);
|
insert into t1 values(default);
|
||||||
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (a GEOMETRY);
|
||||||
|
CREATE VIEW v1 AS SELECT GeomFromwkb(ASBINARY(a)) FROM t1;
|
||||||
|
CREATE VIEW v2 AS SELECT a FROM t1;
|
||||||
|
DESCRIBE v1;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
GeomFromwkb(ASBINARY(a)) geometry YES NULL
|
||||||
|
DESCRIBE v2;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
a geometry YES NULL
|
||||||
|
DROP VIEW v1,v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -479,3 +479,14 @@ create table t1 (g geometry not null);
|
|||||||
insert into t1 values(default);
|
insert into t1 values(default);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #27300: create view with geometry functions lost columns types
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a GEOMETRY);
|
||||||
|
CREATE VIEW v1 AS SELECT GeomFromwkb(ASBINARY(a)) FROM t1;
|
||||||
|
CREATE VIEW v2 AS SELECT a FROM t1;
|
||||||
|
DESCRIBE v1;
|
||||||
|
DESCRIBE v2;
|
||||||
|
|
||||||
|
DROP VIEW v1,v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
@ -4275,7 +4275,6 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table)
|
|||||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
case MYSQL_TYPE_MEDIUM_BLOB:
|
||||||
case MYSQL_TYPE_LONG_BLOB:
|
case MYSQL_TYPE_LONG_BLOB:
|
||||||
case MYSQL_TYPE_BLOB:
|
case MYSQL_TYPE_BLOB:
|
||||||
case MYSQL_TYPE_GEOMETRY:
|
|
||||||
if (this->type() == Item::TYPE_HOLDER)
|
if (this->type() == Item::TYPE_HOLDER)
|
||||||
return new Field_blob(max_length, maybe_null, name, table,
|
return new Field_blob(max_length, maybe_null, name, table,
|
||||||
collation.collation, 1);
|
collation.collation, 1);
|
||||||
@ -4283,6 +4282,10 @@ Field *Item::tmp_table_field_from_field_type(TABLE *table)
|
|||||||
return new Field_blob(max_length, maybe_null, name, table,
|
return new Field_blob(max_length, maybe_null, name, table,
|
||||||
collation.collation);
|
collation.collation);
|
||||||
break; // Blob handled outside of case
|
break; // Blob handled outside of case
|
||||||
|
case MYSQL_TYPE_GEOMETRY:
|
||||||
|
return new Field_geom(max_length, maybe_null, name, table,
|
||||||
|
(Field::geometry_type)
|
||||||
|
((Item_geometry_func *)this)->get_geometry_type());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8793,12 +8793,12 @@ static Field *create_tmp_field_from_item(THD *thd, Item *item, TABLE *table,
|
|||||||
|
|
||||||
enum enum_field_types type;
|
enum enum_field_types type;
|
||||||
/*
|
/*
|
||||||
DATE/TIME fields have STRING_RESULT result type. To preserve
|
DATE/TIME and GEOMETRY fields have STRING_RESULT result type.
|
||||||
type they needed to be handled separately.
|
To preserve type they needed to be handled separately.
|
||||||
*/
|
*/
|
||||||
if ((type= item->field_type()) == MYSQL_TYPE_DATETIME ||
|
if ((type= item->field_type()) == MYSQL_TYPE_DATETIME ||
|
||||||
type == MYSQL_TYPE_TIME || type == MYSQL_TYPE_DATE ||
|
type == MYSQL_TYPE_TIME || type == MYSQL_TYPE_DATE ||
|
||||||
type == MYSQL_TYPE_TIMESTAMP)
|
type == MYSQL_TYPE_TIMESTAMP || type == MYSQL_TYPE_GEOMETRY)
|
||||||
new_field= item->tmp_table_field_from_field_type(table);
|
new_field= item->tmp_table_field_from_field_type(table);
|
||||||
/*
|
/*
|
||||||
Make sure that the blob fits into a Field_varstring which has
|
Make sure that the blob fits into a Field_varstring which has
|
||||||
|
Reference in New Issue
Block a user