diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-10-04 10:12:27 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-10-04 10:12:27 +0400 |
commit | 57ce0bab3242dfc709ab051cc96d991586021e5f (patch) | |
tree | 7e44240962c7fd7391d80c0df084c9ea38b2ff45 /sql/sql_type_geom.cc | |
parent | c2d8db66be4e9a564fd3d199234a38e03035cb85 (diff) | |
download | mariadb-git-57ce0bab3242dfc709ab051cc96d991586021e5f.tar.gz |
A cleanup for MDEV-19908 Add class Type_collection
Moving geometry types aggregation inside Type_collection_geometry
This change introduces a static method Type_aggregator::find_handler_in_array(),
which will later be reused by other data type plugins.
Diffstat (limited to 'sql/sql_type_geom.cc')
-rw-r--r-- | sql/sql_type_geom.cc | 78 |
1 files changed, 70 insertions, 8 deletions
diff --git a/sql/sql_type_geom.cc b/sql/sql_type_geom.cc index 16276250f66..adc8163038a 100644 --- a/sql/sql_type_geom.cc +++ b/sql/sql_type_geom.cc @@ -147,23 +147,84 @@ Type_handler_geometry::type_handler_frm_unpack(const uchar *buffer) const } +const Type_handler * +Type_collection_geometry::aggregate_for_comparison(const Type_handler *a, + const Type_handler *b) + const +{ + const Type_handler *h; + if ((h= aggregate_common(a, b)) || + (h= aggregate_if_null(a, b)) || + (h= aggregate_if_long_blob(a, b))) + return h; + return NULL; +} + + +const Type_handler * +Type_collection_geometry::aggregate_for_result(const Type_handler *a, + const Type_handler *b) + const +{ + const Type_handler *h; + if ((h= aggregate_common(a, b)) || + (h= aggregate_if_null(a, b)) || + (h= aggregate_if_long_blob(a, b)) || + (h= aggregate_if_string(a, b))) + return h; + return NULL; +} + + +const Type_handler * +Type_collection_geometry::aggregate_for_min_max(const Type_handler *a, + const Type_handler *b) + const +{ + const Type_handler *h; + if ((h= aggregate_common(a, b)) || + (h= aggregate_if_null(a, b)) || + (h= aggregate_if_long_blob(a, b)) || + (h= aggregate_if_string(a, b))) + return h; + return NULL; +} + + +const Type_handler * +Type_collection_geometry::aggregate_if_string(const Type_handler *a, + const Type_handler *b) const +{ + if (a->type_collection() == this) + { + DBUG_ASSERT(b->type_collection() != this); + swap_variables(const Type_handler *, a, b); + } + if (a == &type_handler_hex_hybrid || + a == &type_handler_tiny_blob || + a == &type_handler_blob || + a == &type_handler_medium_blob || + a == &type_handler_varchar || + a == &type_handler_string) + return &type_handler_long_blob; + return NULL; +} + + +#ifndef DBUG_OFF bool Type_collection_geometry::init_aggregators(Type_handler_data *data, const Type_handler *geom) const { Type_aggregator *r= &data->m_type_aggregator_for_result; - Type_aggregator *c= &data->m_type_aggregator_for_comparison; return - r->add(geom, &type_handler_null, geom) || r->add(geom, &type_handler_hex_hybrid, &type_handler_long_blob) || r->add(geom, &type_handler_tiny_blob, &type_handler_long_blob) || r->add(geom, &type_handler_blob, &type_handler_long_blob) || r->add(geom, &type_handler_medium_blob, &type_handler_long_blob) || - r->add(geom, &type_handler_long_blob, &type_handler_long_blob) || r->add(geom, &type_handler_varchar, &type_handler_long_blob) || - r->add(geom, &type_handler_string, &type_handler_long_blob) || - c->add(geom, &type_handler_null, geom) || - c->add(geom, &type_handler_long_blob, &type_handler_long_blob); + r->add(geom, &type_handler_string, &type_handler_long_blob); } +#endif bool Type_collection_geometry::init(Type_handler_data *data) @@ -173,8 +234,7 @@ bool Type_collection_geometry::init(Type_handler_data *data) if (nct->add(&type_handler_point, &type_handler_varchar, &type_handler_long_blob)) - return true; -#endif // DBUG_OFF + return true; return init_aggregators(data, &type_handler_geometry) || init_aggregators(data, &type_handler_geometrycollection) || @@ -184,6 +244,8 @@ bool Type_collection_geometry::init(Type_handler_data *data) init_aggregators(data, &type_handler_multipoint) || init_aggregators(data, &type_handler_multilinestring) || init_aggregators(data, &type_handler_multipolygon); +#endif // DBUG_OFF + return false; } |