mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Code that had to be changed so that CREATE ... SELECT ... always
creates proper column types, out of any function, expression or from other tables. mysql-test/r/create.result: This is a result for the test which creates all proper column types out of CREATE ... SELECT ...
This commit is contained in:
@ -76,4 +76,14 @@ x varchar(50) YES NULL
|
|||||||
describe t2;
|
describe t2;
|
||||||
Field Type Null Key Default Extra
|
Field Type Null Key Default Extra
|
||||||
x char(50) YES NULL
|
x char(50) YES NULL
|
||||||
|
drop table t2;
|
||||||
|
create table t2 select now() as a , curtime() as b, curdate() as c , 1+1 as d , 1.0 + 1 as e , 33333333333333333 + 3 as f;
|
||||||
|
describe t2;
|
||||||
|
Field Type Null Key Default Extra
|
||||||
|
a datetime 0000-00-00 00:00:00
|
||||||
|
b time 00:00:00
|
||||||
|
c date 0000-00-00
|
||||||
|
d bigint(17) 0
|
||||||
|
e double(18,1) 0.0
|
||||||
|
f bigint(17) 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
12
sql/field.h
12
sql/field.h
@ -593,6 +593,10 @@ public:
|
|||||||
:Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
|
:Field_str(ptr_arg, 10, null_ptr_arg, null_bit_arg,
|
||||||
unireg_check_arg, field_name_arg, table_arg)
|
unireg_check_arg, field_name_arg, table_arg)
|
||||||
{}
|
{}
|
||||||
|
Field_date(bool maybe_null_arg, const char *field_name_arg,
|
||||||
|
struct st_table *table_arg)
|
||||||
|
:Field_str((char*) 0,10, maybe_null_arg ? (uchar*) "": 0,0,
|
||||||
|
NONE, field_name_arg, table_arg) {}
|
||||||
enum_field_types type() const { return FIELD_TYPE_DATE;}
|
enum_field_types type() const { return FIELD_TYPE_DATE;}
|
||||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
|
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; }
|
||||||
enum Item_result cmp_type () const { return INT_RESULT; }
|
enum Item_result cmp_type () const { return INT_RESULT; }
|
||||||
@ -650,6 +654,10 @@ public:
|
|||||||
:Field_str(ptr_arg, 8, null_ptr_arg, null_bit_arg,
|
:Field_str(ptr_arg, 8, null_ptr_arg, null_bit_arg,
|
||||||
unireg_check_arg, field_name_arg, table_arg)
|
unireg_check_arg, field_name_arg, table_arg)
|
||||||
{}
|
{}
|
||||||
|
Field_time(bool maybe_null_arg, const char *field_name_arg,
|
||||||
|
struct st_table *table_arg)
|
||||||
|
:Field_str((char*) 0,8, maybe_null_arg ? (uchar*) "": 0,0,
|
||||||
|
NONE, field_name_arg, table_arg) {}
|
||||||
enum_field_types type() const { return FIELD_TYPE_TIME;}
|
enum_field_types type() const { return FIELD_TYPE_TIME;}
|
||||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
|
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
|
||||||
enum Item_result cmp_type () const { return INT_RESULT; }
|
enum Item_result cmp_type () const { return INT_RESULT; }
|
||||||
@ -678,6 +686,10 @@ public:
|
|||||||
:Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
|
:Field_str(ptr_arg, 19, null_ptr_arg, null_bit_arg,
|
||||||
unireg_check_arg, field_name_arg, table_arg)
|
unireg_check_arg, field_name_arg, table_arg)
|
||||||
{}
|
{}
|
||||||
|
Field_datetime(bool maybe_null_arg, const char *field_name_arg,
|
||||||
|
struct st_table *table_arg)
|
||||||
|
:Field_str((char*) 0,19, maybe_null_arg ? (uchar*) "": 0,0,
|
||||||
|
NONE, field_name_arg, table_arg) {}
|
||||||
enum_field_types type() const { return FIELD_TYPE_DATETIME;}
|
enum_field_types type() const { return FIELD_TYPE_DATETIME;}
|
||||||
#ifdef HAVE_LONG_LONG
|
#ifdef HAVE_LONG_LONG
|
||||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }
|
enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; }
|
||||||
|
@ -64,7 +64,7 @@ public:
|
|||||||
virtual longlong val_int()=0;
|
virtual longlong val_int()=0;
|
||||||
virtual String *val_str(String*)=0;
|
virtual String *val_str(String*)=0;
|
||||||
virtual void make_field(Send_field *field)=0;
|
virtual void make_field(Send_field *field)=0;
|
||||||
virtual Field *tmp_table_field() { return 0; }
|
virtual Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return 0; }
|
||||||
virtual const char *full_name() const { return name ? name : "???"; }
|
virtual const char *full_name() const { return name ? name : "???"; }
|
||||||
virtual double val_result() { return val(); }
|
virtual double val_result() { return val(); }
|
||||||
virtual longlong val_int_result() { return val_int(); }
|
virtual longlong val_int_result() { return val_int(); }
|
||||||
@ -128,7 +128,7 @@ public:
|
|||||||
{
|
{
|
||||||
return field->result_type();
|
return field->result_type();
|
||||||
}
|
}
|
||||||
Field *tmp_table_field() { return result_field; }
|
Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; }
|
||||||
bool get_date(TIME *ltime,bool fuzzydate);
|
bool get_date(TIME *ltime,bool fuzzydate);
|
||||||
bool get_time(TIME *ltime);
|
bool get_time(TIME *ltime);
|
||||||
bool is_null() { return field->is_null(); }
|
bool is_null() { return field->is_null(); }
|
||||||
@ -308,7 +308,7 @@ public:
|
|||||||
Field *result_field; /* Save result here */
|
Field *result_field; /* Save result here */
|
||||||
Item_result_field() :result_field(0) {}
|
Item_result_field() :result_field(0) {}
|
||||||
~Item_result_field() {} /* Required with gcc 2.95 */
|
~Item_result_field() {} /* Required with gcc 2.95 */
|
||||||
Field *tmp_table_field() { return result_field; }
|
Field *tmp_table_field(TABLE *t_arg=(TABLE *)0) { return result_field; }
|
||||||
table_map used_tables() const { return 1; }
|
table_map used_tables() const { return 1; }
|
||||||
virtual void fix_length_and_dec()=0;
|
virtual void fix_length_and_dec()=0;
|
||||||
};
|
};
|
||||||
|
@ -135,6 +135,11 @@ public:
|
|||||||
longlong val_int() { return (longlong) val(); }
|
longlong val_int() { return (longlong) val(); }
|
||||||
enum Item_result result_type () const { return REAL_RESULT; }
|
enum Item_result result_type () const { return REAL_RESULT; }
|
||||||
void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
|
void fix_length_and_dec() { decimals=NOT_FIXED_DEC; max_length=float_length(decimals); }
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return new Field_double(max_length, maybe_null, name,t_arg,decimals);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_num_func :public Item_func
|
class Item_num_func :public Item_func
|
||||||
@ -164,6 +169,11 @@ class Item_num_op :public Item_func
|
|||||||
void fix_length_and_dec() { fix_num_length_and_dec(); find_num_type(); }
|
void fix_length_and_dec() { fix_num_length_and_dec(); find_num_type(); }
|
||||||
void find_num_type(void);
|
void find_num_type(void);
|
||||||
bool is_null() { (void) val(); return null_value; }
|
bool is_null() { (void) val(); return null_value; }
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return args[0]->result_type() == INT_RESULT ? ((max_length > 11) ? (Field *)new Field_longlong(max_length,maybe_null,name, t_arg,unsigned_flag) : (Field *)new Field_long(max_length,maybe_null,name, t_arg,unsigned_flag)) : (Field *) new Field_double(max_length, maybe_null, name,t_arg,decimals);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -179,6 +189,11 @@ public:
|
|||||||
String *val_str(String*str);
|
String *val_str(String*str);
|
||||||
enum Item_result result_type () const { return INT_RESULT; }
|
enum Item_result result_type () const { return INT_RESULT; }
|
||||||
void fix_length_and_dec() { decimals=0; max_length=21; }
|
void fix_length_and_dec() { decimals=0; max_length=21; }
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return (max_length > 11) ? (Field *)new Field_longlong(max_length,maybe_null,name, t_arg,unsigned_flag) : (Field *)new Field_long(max_length,maybe_null,name, t_arg,unsigned_flag);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_plus :public Item_num_op
|
class Item_func_plus :public Item_num_op
|
||||||
|
@ -35,6 +35,11 @@ public:
|
|||||||
double val();
|
double val();
|
||||||
enum Item_result result_type () const { return STRING_RESULT; }
|
enum Item_result result_type () const { return STRING_RESULT; }
|
||||||
void left_right_max_length();
|
void left_right_max_length();
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return (max_length > 255) ? (Field *)new Field_blob(max_length,maybe_null, name,t_arg, binary) : (Field *) new Field_string(max_length,maybe_null, name,t_arg, binary);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Item_func_md5 :public Item_str_func
|
class Item_func_md5 :public Item_str_func
|
||||||
|
@ -233,6 +233,11 @@ public:
|
|||||||
{
|
{
|
||||||
init_make_field(tmp_field,FIELD_TYPE_DATE);
|
init_make_field(tmp_field,FIELD_TYPE_DATE);
|
||||||
}
|
}
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return new Field_date(maybe_null, name, t_arg);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -246,6 +251,11 @@ public:
|
|||||||
{
|
{
|
||||||
init_make_field(tmp_field,FIELD_TYPE_DATETIME);
|
init_make_field(tmp_field,FIELD_TYPE_DATETIME);
|
||||||
}
|
}
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return new Field_datetime(maybe_null, name, t_arg);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -268,6 +278,11 @@ public:
|
|||||||
{
|
{
|
||||||
init_make_field(tmp_field,FIELD_TYPE_TIME);
|
init_make_field(tmp_field,FIELD_TYPE_TIME);
|
||||||
}
|
}
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return new Field_time(maybe_null, name, t_arg);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -355,6 +370,12 @@ public:
|
|||||||
{
|
{
|
||||||
init_make_field(tmp_field,FIELD_TYPE_TIME);
|
init_make_field(tmp_field,FIELD_TYPE_TIME);
|
||||||
}
|
}
|
||||||
|
Field *tmp_table_field(TABLE *t_arg)
|
||||||
|
{
|
||||||
|
if (!t_arg) return result_field;
|
||||||
|
return new Field_time(maybe_null, name, t_arg);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum interval_type { INTERVAL_YEAR, INTERVAL_MONTH, INTERVAL_DAY,
|
enum interval_type { INTERVAL_YEAR, INTERVAL_MONTH, INTERVAL_DAY,
|
||||||
|
@ -704,8 +704,11 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
my_error(ER_WRONG_COLUMN_NAME,MYF(0),item->name);
|
my_error(ER_WRONG_COLUMN_NAME,MYF(0),item->name);
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
Field *field;
|
||||||
Field *field=create_tmp_field(thd, &tmp_table, item, item->type(),
|
if (item->type() == Item::FUNC_ITEM)
|
||||||
|
field=item->tmp_table_field(&tmp_table);
|
||||||
|
else
|
||||||
|
field=create_tmp_field(thd, &tmp_table, item, item->type(),
|
||||||
(Item_result_field***) 0, &tmp_field,0,0);
|
(Item_result_field***) 0, &tmp_field,0,0);
|
||||||
if (!field ||
|
if (!field ||
|
||||||
!(cr_field=new create_field(field,(item->type() == Item::FIELD_ITEM ?
|
!(cr_field=new create_field(field,(item->type() == Item::FIELD_ITEM ?
|
||||||
|
Reference in New Issue
Block a user