From e3fed3b9b4f488e9ad1afa57333ae80249e6cb17 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 27 Nov 2015 20:50:19 +0400 Subject: [PATCH] A patch for MDEV-4912 Add a plugin to field types (column types) Adding Column_definition::make_field() as a convenience wrapper for ::make_field. --- sql/field.h | 35 +++++++++++++++++++++++++++-------- sql/sp_head.cc | 22 ++++++---------------- sql/sql_select.cc | 10 ++++------ sql/sql_show.cc | 28 ++++------------------------ 4 files changed, 41 insertions(+), 54 deletions(-) diff --git a/sql/field.h b/sql/field.h index 0591914b8c7..9f743f90628 100644 --- a/sql/field.h +++ b/sql/field.h @@ -3417,6 +3417,16 @@ public: extern const LEX_STRING null_lex_str; + +Field *make_field(TABLE_SHARE *share, MEM_ROOT *mem_root, + uchar *ptr, uint32 field_length, + uchar *null_pos, uchar null_bit, + uint pack_flag, enum_field_types field_type, + CHARSET_INFO *cs, + Field::geometry_type geom_type, uint srid, + Field::utype unireg_check, + TYPELIB *interval, const char *field_name); + /* Create field class for CREATE TABLE */ @@ -3505,6 +3515,23 @@ public: unireg_check == Field::TIMESTAMP_UN_FIELD || unireg_check == Field::NEXT_NUMBER); } + + Field *make_field(TABLE_SHARE *share, MEM_ROOT *mem_root, + uchar *ptr, uchar *null_pos, uchar null_bit, + const char *field_name_arg) const + { + return ::make_field(share, mem_root, ptr, + length, null_pos, null_bit, + pack_flag, sql_type, charset, + geom_type, srid, unireg_check, interval, + field_name_arg); + } + Field *make_field(TABLE_SHARE *share, MEM_ROOT *mem_root, + const char *field_name_arg) + { + return make_field(share, mem_root, (uchar *) 0, (uchar *) "", 0, + field_name_arg); + } }; @@ -3596,14 +3623,6 @@ public: }; -Field *make_field(TABLE_SHARE *share, MEM_ROOT *mem_root, - uchar *ptr, uint32 field_length, - uchar *null_pos, uchar null_bit, - uint pack_flag, enum_field_types field_type, - CHARSET_INFO *cs, - Field::geometry_type geom_type, uint srid, - Field::utype unireg_check, - TYPELIB *interval, const char *field_name); uint pack_length_to_packflag(uint type); enum_field_types get_blob_type_from_length(ulong length); uint32 calc_pack_length(enum_field_types type,uint32 length); diff --git a/sql/sp_head.cc b/sql/sp_head.cc index cf0b8e8106f..f04821eba24 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -863,27 +863,17 @@ Field * sp_head::create_result_field(uint field_max_length, const char *field_name, TABLE *table) { - uint field_length; Field *field; DBUG_ENTER("sp_head::create_result_field"); - field_length= !m_return_field_def.length ? - field_max_length : m_return_field_def.length; + DBUG_ASSERT(field_max_length <= m_return_field_def.length); - field= ::make_field(table->s, /* TABLE_SHARE ptr */ - table->in_use->mem_root, - (uchar*) 0, /* field ptr */ - field_length, /* field [max] length */ - (uchar*) "", /* null ptr */ - 0, /* null bit */ - m_return_field_def.pack_flag, - m_return_field_def.sql_type, - m_return_field_def.charset, - m_return_field_def.geom_type, m_return_field_def.srid, - Field::NONE, /* unreg check */ - m_return_field_def.interval, - field_name ? field_name : (const char *) m_name.str); + field= m_return_field_def.make_field(table->s, /* TABLE_SHARE ptr */ + table->in_use->mem_root, + field_name ? + field_name : + (const char *) m_name.str); field->vcol_info= m_return_field_def.vcol_info; if (field) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 6a12c056282..62ca735b2c8 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -16981,12 +16981,10 @@ TABLE *create_virtual_tmp_table(THD *thd, List &field_list) List_iterator_fast it(field_list); while ((cdef= it++)) { - *field= make_field(share, thd->mem_root, 0, cdef->length, - (uchar*) (f_maybe_null(cdef->pack_flag) ? "" : 0), - f_maybe_null(cdef->pack_flag) ? 1 : 0, - cdef->pack_flag, cdef->sql_type, cdef->charset, - cdef->geom_type, cdef->srid, cdef->unireg_check, - cdef->interval, cdef->field_name); + *field= cdef->make_field(share, thd->mem_root, 0, + (uchar*) (f_maybe_null(cdef->pack_flag) ? "" : 0), + f_maybe_null(cdef->pack_flag) ? 1 : 0, + cdef->field_name); if (!*field) goto error; (*field)->init(table); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 1fb57d1132a..a79e0e1d779 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -5627,7 +5627,6 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table, if (sp) { Field *field; - Column_definition *field_def; String tmp_string; if (routine_type == TYPE_ENUM_FUNCTION) { @@ -5639,14 +5638,7 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table, get_field(thd->mem_root, proc_table->field[MYSQL_PROC_MYSQL_TYPE], &tmp_string); table->field[15]->store(tmp_string.ptr(), tmp_string.length(), cs); - field_def= &sp->m_return_field_def; - field= make_field(&share, thd->mem_root, - (uchar*) 0, field_def->length, - (uchar*) "", 0, field_def->pack_flag, - field_def->sql_type, field_def->charset, - field_def->geom_type, field_def->srid, Field::NONE, - field_def->interval, ""); - + field= sp->m_return_field_def.make_field(&share, thd->mem_root, ""); field->table= &tbl; tbl.in_use= thd; store_column_type(table, field, cs, 6); @@ -5665,7 +5657,6 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table, { const char *tmp_buff; sp_variable *spvar= spcont->find_variable(i); - field_def= &spvar->field_def; switch (spvar->mode) { case sp_variable::MODE_IN: tmp_buff= "IN"; @@ -5694,12 +5685,8 @@ bool store_schema_params(THD *thd, TABLE *table, TABLE *proc_table, &tmp_string); table->field[15]->store(tmp_string.ptr(), tmp_string.length(), cs); - field= make_field(&share, thd->mem_root, (uchar*) 0, field_def->length, - (uchar*) "", 0, field_def->pack_flag, - field_def->sql_type, field_def->charset, - field_def->geom_type, field_def->srid, Field::NONE, - field_def->interval, spvar->name.str); - + field= spvar->field_def.make_field(&share, thd->mem_root, + spvar->name.str); field->table= &tbl; tbl.in_use= thd; store_column_type(table, field, cs, 6); @@ -5786,18 +5773,11 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table, TABLE_SHARE share; TABLE tbl; Field *field; - Column_definition *field_def= &sp->m_return_field_def; bzero((char*) &tbl, sizeof(TABLE)); (void) build_table_filename(path, sizeof(path), "", "", "", 0); init_tmp_table_share(thd, &share, "", 0, "", path); - field= make_field(&share, thd->mem_root, (uchar*) 0, - field_def->length, - (uchar*) "", 0, field_def->pack_flag, - field_def->sql_type, field_def->charset, - field_def->geom_type, field_def->srid, Field::NONE, - field_def->interval, ""); - + field= sp->m_return_field_def.make_field(&share, thd->mem_root, ""); field->table= &tbl; tbl.in_use= thd; store_column_type(table, field, cs, 5);