/* Copyright (c) 2015 MariaDB Foundation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "sql_type.h" #include "sql_const.h" static Type_handler_tiny type_handler_tiny; static Type_handler_short type_handler_short; static Type_handler_long type_handler_long; static Type_handler_longlong type_handler_longlong; static Type_handler_int24 type_handler_int24; static Type_handler_year type_handler_year; static Type_handler_bit type_handler_bit; static Type_handler_float type_handler_float; static Type_handler_double type_handler_double; static Type_handler_time type_handler_time; static Type_handler_date type_handler_date; static Type_handler_datetime type_handler_datetime; static Type_handler_timestamp type_handler_timestamp; static Type_handler_olddecimal type_handler_olddecimal; static Type_handler_newdecimal type_handler_newdecimal; static Type_handler_null type_handler_null; static Type_handler_string type_handler_string; static Type_handler_varchar type_handler_varchar; static Type_handler_tiny_blob type_handler_tiny_blob; static Type_handler_medium_blob type_handler_medium_blob; static Type_handler_long_blob type_handler_long_blob; static Type_handler_blob type_handler_blob; static Type_handler_geometry type_handler_geometry; /** This method is used by: - Item_user_var_as_out_param::field_type() - Item_func_udf_str::field_type() - Item_empty_string::make_field() TODO: type_handler_adjusted_to_max_octet_length() and string_type_handler() provide very similar functionality, to properly choose between VARCHAR/VARBINARY vs TEXT/BLOB variations taking into accoung maximum possible octet length. We should probably get rid of either of them and use the same method all around the code. */ const Type_handler * Type_handler::string_type_handler(uint max_octet_length) const { if (max_octet_length >= 16777216) return &type_handler_long_blob; else if (max_octet_length >= 65536) return &type_handler_medium_blob; return &type_handler_varchar; } /** This method is used by: - Item_sum_hybrid, e.g. MAX(item), MIN(item). - Item_func_set_user_var */ const Type_handler * Type_handler_string_result::type_handler_adjusted_to_max_octet_length( uint max_octet_length, CHARSET_INFO *cs) const { if (max_octet_length / cs->mbmaxlen <= CONVERT_IF_BIGGER_TO_BLOB) return &type_handler_varchar; // See also Item::too_big_for_varchar() if (max_octet_length >= 16777216) return &type_handler_long_blob; else if (max_octet_length >= 65536) return &type_handler_medium_blob; return &type_handler_blob; } const Type_handler * Type_handler_hybrid_field_type::get_handler_by_result_type(Item_result type) const { switch (type) { case REAL_RESULT: return &type_handler_double; case INT_RESULT: return &type_handler_longlong; case DECIMAL_RESULT: return &type_handler_newdecimal; case STRING_RESULT: return &type_handler_long_blob; case TIME_RESULT: case ROW_RESULT: DBUG_ASSERT(0); } return &type_handler_string; } Type_handler_hybrid_field_type::Type_handler_hybrid_field_type() :m_type_handler(&type_handler_double) { } const Type_handler * Type_handler_hybrid_field_type::get_handler_by_field_type(enum_field_types type) const { switch (type) { case MYSQL_TYPE_DECIMAL: return &type_handler_olddecimal; case MYSQL_TYPE_NEWDECIMAL: return &type_handler_newdecimal; case MYSQL_TYPE_TINY: return &type_handler_tiny; case MYSQL_TYPE_SHORT: return &type_handler_short; case MYSQL_TYPE_LONG: return &type_handler_long; case MYSQL_TYPE_LONGLONG: return &type_handler_longlong; case MYSQL_TYPE_INT24: return &type_handler_int24; case MYSQL_TYPE_YEAR: return &type_handler_year; case MYSQL_TYPE_BIT: return &type_handler_bit; case MYSQL_TYPE_FLOAT: return &type_handler_float; case MYSQL_TYPE_DOUBLE: return &type_handler_double; case MYSQL_TYPE_NULL: return &type_handler_null; case MYSQL_TYPE_VARCHAR: return &type_handler_varchar; case MYSQL_TYPE_TINY_BLOB: return &type_handler_tiny_blob; case MYSQL_TYPE_MEDIUM_BLOB: return &type_handler_medium_blob; case MYSQL_TYPE_LONG_BLOB: return &type_handler_long_blob; case MYSQL_TYPE_BLOB: return &type_handler_blob; case MYSQL_TYPE_VAR_STRING: return &type_handler_varchar; // Map to VARCHAR case MYSQL_TYPE_STRING: return &type_handler_string; case MYSQL_TYPE_ENUM: return &type_handler_varchar; // Map to VARCHAR case MYSQL_TYPE_SET: return &type_handler_varchar; // Map to VARCHAR case MYSQL_TYPE_GEOMETRY: return &type_handler_geometry; case MYSQL_TYPE_TIMESTAMP: return &type_handler_timestamp; case MYSQL_TYPE_TIMESTAMP2: return &type_handler_timestamp; case MYSQL_TYPE_DATE: return &type_handler_date; case MYSQL_TYPE_TIME: return &type_handler_time; case MYSQL_TYPE_TIME2: return &type_handler_time; case MYSQL_TYPE_DATETIME: return &type_handler_datetime; case MYSQL_TYPE_DATETIME2: return &type_handler_datetime; case MYSQL_TYPE_NEWDATE: return &type_handler_date; }; DBUG_ASSERT(0); return &type_handler_string; }