mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-12833 Split Column_definition::create_length_to_internal_length() to virtual methods in Type_handler
This commit is contained in:
82
sql/field.cc
82
sql/field.cc
@ -9805,61 +9805,6 @@ void Column_definition::create_length_to_internal_length_newdecimal()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Convert create_field::length from number of characters to number of bytes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void Column_definition::create_length_to_internal_length(void)
|
|
||||||
{
|
|
||||||
switch (real_field_type()) {
|
|
||||||
case MYSQL_TYPE_TINY_BLOB:
|
|
||||||
case MYSQL_TYPE_MEDIUM_BLOB:
|
|
||||||
case MYSQL_TYPE_LONG_BLOB:
|
|
||||||
case MYSQL_TYPE_BLOB:
|
|
||||||
case MYSQL_TYPE_GEOMETRY:
|
|
||||||
case MYSQL_TYPE_VAR_STRING:
|
|
||||||
case MYSQL_TYPE_STRING:
|
|
||||||
case MYSQL_TYPE_VARCHAR:
|
|
||||||
create_length_to_internal_length_string();
|
|
||||||
break;
|
|
||||||
case MYSQL_TYPE_ENUM:
|
|
||||||
case MYSQL_TYPE_SET:
|
|
||||||
create_length_to_internal_length_typelib();
|
|
||||||
break;
|
|
||||||
case MYSQL_TYPE_BIT:
|
|
||||||
create_length_to_internal_length_bit();
|
|
||||||
break;
|
|
||||||
case MYSQL_TYPE_NEWDECIMAL:
|
|
||||||
create_length_to_internal_length_newdecimal();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MYSQL_TYPE_NULL:
|
|
||||||
create_length_to_internal_length_null();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MYSQL_TYPE_DECIMAL:
|
|
||||||
case MYSQL_TYPE_TINY:
|
|
||||||
case MYSQL_TYPE_SHORT:
|
|
||||||
case MYSQL_TYPE_INT24:
|
|
||||||
case MYSQL_TYPE_LONG:
|
|
||||||
case MYSQL_TYPE_LONGLONG:
|
|
||||||
case MYSQL_TYPE_YEAR:
|
|
||||||
case MYSQL_TYPE_FLOAT:
|
|
||||||
case MYSQL_TYPE_DOUBLE:
|
|
||||||
case MYSQL_TYPE_TIME:
|
|
||||||
case MYSQL_TYPE_TIME2:
|
|
||||||
case MYSQL_TYPE_DATE:
|
|
||||||
case MYSQL_TYPE_NEWDATE:
|
|
||||||
case MYSQL_TYPE_DATETIME:
|
|
||||||
case MYSQL_TYPE_DATETIME2:
|
|
||||||
case MYSQL_TYPE_TIMESTAMP:
|
|
||||||
case MYSQL_TYPE_TIMESTAMP2:
|
|
||||||
create_length_to_internal_length_simple();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool check_expression(Virtual_column_info *vcol, LEX_CSTRING *name,
|
bool check_expression(Virtual_column_info *vcol, LEX_CSTRING *name,
|
||||||
enum_vcol_info_type type)
|
enum_vcol_info_type type)
|
||||||
|
|
||||||
@ -10496,6 +10441,33 @@ Column_definition::Column_definition(THD *thd, Field *old_field,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
The common part for data type redefinition:
|
||||||
|
CREATE TABLE t1 (a INT) AS SELECT a FROM t2;
|
||||||
|
See Type_handler::Column_definition_redefine_stage1()
|
||||||
|
for data type specific code.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Column_definition::redefine_stage1_common(const Column_definition *dup_field,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
{
|
||||||
|
set_handler(dup_field->type_handler());
|
||||||
|
default_value= dup_field->default_value;
|
||||||
|
charset= dup_field->charset ? dup_field->charset :
|
||||||
|
schema->default_table_charset;
|
||||||
|
length= dup_field->char_length;
|
||||||
|
pack_length= dup_field->pack_length;
|
||||||
|
key_length= dup_field->key_length;
|
||||||
|
decimals= dup_field->decimals;
|
||||||
|
unireg_check= dup_field->unireg_check;
|
||||||
|
flags= dup_field->flags;
|
||||||
|
interval= dup_field->interval;
|
||||||
|
vcol_info= dup_field->vcol_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
maximum possible character length for blob.
|
maximum possible character length for blob.
|
||||||
|
|
||||||
|
11
sql/field.h
11
sql/field.h
@ -3887,7 +3887,6 @@ public:
|
|||||||
}
|
}
|
||||||
Column_definition(THD *thd, Field *field, Field *orig_field);
|
Column_definition(THD *thd, Field *field, Field *orig_field);
|
||||||
void set_attributes(const Lex_field_type_st &type, CHARSET_INFO *cs);
|
void set_attributes(const Lex_field_type_st &type, CHARSET_INFO *cs);
|
||||||
void create_length_to_internal_length(void);
|
|
||||||
void create_length_to_internal_length_null()
|
void create_length_to_internal_length_null()
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(length == 0);
|
DBUG_ASSERT(length == 0);
|
||||||
@ -3955,6 +3954,16 @@ public:
|
|||||||
bool prepare_stage1_bit(THD *thd, MEM_ROOT *mem_root,
|
bool prepare_stage1_bit(THD *thd, MEM_ROOT *mem_root,
|
||||||
handler *file, ulonglong table_flags);
|
handler *file, ulonglong table_flags);
|
||||||
|
|
||||||
|
void redefine_stage1_common(const Column_definition *dup_field,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema);
|
||||||
|
bool redefine_stage1(const Column_definition *dup_field, const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
{
|
||||||
|
const Type_handler *handler= dup_field->type_handler();
|
||||||
|
return handler->Column_definition_redefine_stage1(this, dup_field,
|
||||||
|
file, schema);
|
||||||
|
}
|
||||||
bool prepare_stage2(handler *handler, ulonglong table_flags);
|
bool prepare_stage2(handler *handler, ulonglong table_flags);
|
||||||
bool prepare_stage2_blob(handler *handler,
|
bool prepare_stage2_blob(handler *handler,
|
||||||
ulonglong table_flags, uint field_flags);
|
ulonglong table_flags, uint field_flags);
|
||||||
|
@ -3355,30 +3355,6 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
file->ha_table_flags() & HA_CAN_BIT_FIELD)
|
file->ha_table_flags() & HA_CAN_BIT_FIELD)
|
||||||
total_uneven_bit_length-= sql_field->length & 7;
|
total_uneven_bit_length-= sql_field->length & 7;
|
||||||
|
|
||||||
sql_field->default_value= dup_field->default_value;
|
|
||||||
sql_field->set_handler(dup_field->type_handler());
|
|
||||||
|
|
||||||
/*
|
|
||||||
If we are replacing a field with a BIT field, we need
|
|
||||||
to initialize pack_flag. Note that we do not need to
|
|
||||||
increment total_uneven_bit_length here as this dup_field
|
|
||||||
has already been processed.
|
|
||||||
*/
|
|
||||||
if (sql_field->real_field_type() == MYSQL_TYPE_BIT)
|
|
||||||
{
|
|
||||||
sql_field->pack_flag= FIELDFLAG_NUMBER;
|
|
||||||
if (!(file->ha_table_flags() & HA_CAN_BIT_FIELD))
|
|
||||||
sql_field->pack_flag|= FIELDFLAG_TREAT_BIT_AS_CHAR;
|
|
||||||
}
|
|
||||||
|
|
||||||
sql_field->charset= (dup_field->charset ?
|
|
||||||
dup_field->charset :
|
|
||||||
create_info->default_table_charset);
|
|
||||||
sql_field->length= dup_field->char_length;
|
|
||||||
sql_field->pack_length= dup_field->pack_length;
|
|
||||||
sql_field->key_length= dup_field->key_length;
|
|
||||||
sql_field->decimals= dup_field->decimals;
|
|
||||||
sql_field->unireg_check= dup_field->unireg_check;
|
|
||||||
/*
|
/*
|
||||||
We're making one field from two, the result field will have
|
We're making one field from two, the result field will have
|
||||||
dup_field->flags as flags. If we've incremented null_fields
|
dup_field->flags as flags. If we've incremented null_fields
|
||||||
@ -3386,10 +3362,10 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
*/
|
*/
|
||||||
if (!(sql_field->flags & NOT_NULL_FLAG))
|
if (!(sql_field->flags & NOT_NULL_FLAG))
|
||||||
null_fields--;
|
null_fields--;
|
||||||
sql_field->flags= dup_field->flags;
|
|
||||||
sql_field->create_length_to_internal_length();
|
if (sql_field->redefine_stage1(dup_field, file, create_info))
|
||||||
sql_field->interval= dup_field->interval;
|
DBUG_RETURN(true);
|
||||||
sql_field->vcol_info= dup_field->vcol_info;
|
|
||||||
it2.remove(); // Remove first (create) definition
|
it2.remove(); // Remove first (create) definition
|
||||||
select_field_pos--;
|
select_field_pos--;
|
||||||
break;
|
break;
|
||||||
|
@ -1634,6 +1634,93 @@ bool Type_handler_geometry::
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************/
|
||||||
|
|
||||||
|
bool Type_handler::
|
||||||
|
Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->redefine_stage1_common(dup, file, schema);
|
||||||
|
def->create_length_to_internal_length_simple();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler_null::
|
||||||
|
Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->redefine_stage1_common(dup, file, schema);
|
||||||
|
def->create_length_to_internal_length_null();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler_newdecimal::
|
||||||
|
Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->redefine_stage1_common(dup, file, schema);
|
||||||
|
def->create_length_to_internal_length_newdecimal();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler_string_result::
|
||||||
|
Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->redefine_stage1_common(dup, file, schema);
|
||||||
|
def->create_length_to_internal_length_string();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler_typelib::
|
||||||
|
Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->redefine_stage1_common(dup, file, schema);
|
||||||
|
def->create_length_to_internal_length_typelib();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Type_handler_bit::
|
||||||
|
Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
def->redefine_stage1_common(dup, file, schema);
|
||||||
|
/*
|
||||||
|
If we are replacing a field with a BIT field, we need
|
||||||
|
to initialize pack_flag.
|
||||||
|
*/
|
||||||
|
def->pack_flag= FIELDFLAG_NUMBER;
|
||||||
|
if (!(file->ha_table_flags() & HA_CAN_BIT_FIELD))
|
||||||
|
def->pack_flag|= FIELDFLAG_TREAT_BIT_AS_CHAR;
|
||||||
|
def->create_length_to_internal_length_bit();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
bool Type_handler::
|
bool Type_handler::
|
||||||
|
@ -68,6 +68,7 @@ class Arg_comparator;
|
|||||||
struct st_value;
|
struct st_value;
|
||||||
class Protocol;
|
class Protocol;
|
||||||
class handler;
|
class handler;
|
||||||
|
struct Schema_specification_st;
|
||||||
struct TABLE;
|
struct TABLE;
|
||||||
struct SORT_FIELD_ATTR;
|
struct SORT_FIELD_ATTR;
|
||||||
|
|
||||||
@ -707,6 +708,28 @@ public:
|
|||||||
Column_definition *c,
|
Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
|
/*
|
||||||
|
This method is called on queries like:
|
||||||
|
CREATE TABLE t2 (a INT) AS SELECT a FROM t1;
|
||||||
|
I.e. column "a" is queried from another table,
|
||||||
|
but its data type is redefined.
|
||||||
|
@param OUT def - The column definition to be redefined
|
||||||
|
@param IN dup - The column definition to take the data type from
|
||||||
|
(i.e. "a INT" in the above example).
|
||||||
|
@param IN file - Table owner handler. If it does not support certain
|
||||||
|
data types, some conversion can be applied.
|
||||||
|
I.g. true BIT to BIT-AS-CHAR.
|
||||||
|
@param IN schema - the owner schema definition, e.g. for the default
|
||||||
|
character set and collation.
|
||||||
|
@retval true - on error
|
||||||
|
@retval false - on success
|
||||||
|
*/
|
||||||
|
virtual bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *
|
||||||
|
schema)
|
||||||
|
const;
|
||||||
virtual bool Column_definition_prepare_stage2(Column_definition *c,
|
virtual bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const= 0;
|
ulonglong table_flags) const= 0;
|
||||||
@ -966,6 +989,15 @@ public:
|
|||||||
DBUG_ASSERT(0);
|
DBUG_ASSERT(0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
bool Column_definition_prepare_stage2(Column_definition *c,
|
bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const
|
ulonglong table_flags) const
|
||||||
@ -1536,6 +1568,11 @@ public:
|
|||||||
Column_definition *c,
|
Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
|
bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const;
|
||||||
uint32 max_display_length(const Item *item) const;
|
uint32 max_display_length(const Item *item) const;
|
||||||
uint Item_time_precision(Item *item) const
|
uint Item_time_precision(Item *item) const
|
||||||
{
|
{
|
||||||
@ -1830,6 +1867,11 @@ public:
|
|||||||
Column_definition *c,
|
Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
|
bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const;
|
||||||
bool Column_definition_prepare_stage2(Column_definition *c,
|
bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
@ -2250,6 +2292,11 @@ public:
|
|||||||
Column_definition *c,
|
Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
|
bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const;
|
||||||
bool Column_definition_prepare_stage2(Column_definition *c,
|
bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
@ -2282,6 +2329,11 @@ public:
|
|||||||
Column_definition *c,
|
Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
|
bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const;
|
||||||
bool Column_definition_prepare_stage2(Column_definition *c,
|
bool Column_definition_prepare_stage2(Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const
|
ulonglong table_flags) const
|
||||||
@ -2573,6 +2625,11 @@ public:
|
|||||||
Column_definition *c,
|
Column_definition *c,
|
||||||
handler *file,
|
handler *file,
|
||||||
ulonglong table_flags) const;
|
ulonglong table_flags) const;
|
||||||
|
bool Column_definition_redefine_stage1(Column_definition *def,
|
||||||
|
const Column_definition *dup,
|
||||||
|
const handler *file,
|
||||||
|
const Schema_specification_st *schema)
|
||||||
|
const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user