1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-20016 Add MariaDB_DATA_TYPE_PLUGIN

This commit is contained in:
Alexander Barkov
2019-10-04 18:33:09 +04:00
parent 627027a674
commit c717483c9d
26 changed files with 3692 additions and 23 deletions

View File

@ -23,6 +23,7 @@
#include "item.h"
#include "log.h"
#include "tztime.h"
#include <mysql/plugin_data_type.h>
const DTCollation &DTCollation_numeric::singleton()
@ -91,10 +92,6 @@ Vers_type_trx vers_type_trx;
class Type_collection_std: public Type_collection
{
public:
bool init(Type_handler_data *data) override
{
return false;
}
const Type_handler *handler_by_name(const LEX_CSTRING &name) const override
{
return NULL;
@ -189,8 +186,23 @@ bool Type_handler_data::init()
const Type_handler *
Type_handler::handler_by_name(const LEX_CSTRING &name)
Type_handler::handler_by_name(THD *thd, const LEX_CSTRING &name)
{
plugin_ref plugin;
if ((plugin= my_plugin_lock_by_name(thd, &name, MariaDB_DATA_TYPE_PLUGIN)))
{
/*
Data type plugins do not maintain ref_count yet.
For now we have only mandatory built-in plugins
and dynamic plugins for test purposes.
It should be safe to unlock the plugin immediately.
*/
const Type_handler *ph= reinterpret_cast<st_mariadb_data_type*>
(plugin_decl(plugin)->info)->type_handler;
plugin_unlock(thd, plugin);
return ph;
}
#ifdef HAVE_SPATIAL
const Type_handler *ha= type_collection_geometry.handler_by_name(name);
if (ha)
@ -213,9 +225,10 @@ static const Type_handler *frm_data_type_info_emulate(const LEX_CSTRING &name)
const Type_handler *
Type_handler::handler_by_name_or_error(const LEX_CSTRING &name)
Type_handler::handler_by_name_or_error(THD *thd, const LEX_CSTRING &name)
{
const Type_handler *h= handler_by_name(name);
const Type_handler *h= handler_by_name(thd, name);
DBUG_EXECUTE_IF("emulate_handler_by_name_or_error_failure", h= NULL;);
if (!h)
{
DBUG_EXECUTE_IF("frm_data_type_info_emulate",
@ -8895,6 +8908,8 @@ bool Type_handler::Column_definition_data_type_info_image(Binary_string *to,
if (cmp_type() == STRING_RESULT)
return to->append("x", 1) ||
to->append(name().lex_cstring()););
if (type_collection() != &type_collection_std)
return to->append(name().lex_cstring());
return false;
}