Commit e4cbbcf8 authored by unknown's avatar unknown

Merge sunlight.local:/local_work/27216-bug-5.0-opt-mysql

into  sunlight.local:/local_work/merge-5.1-opt-mysql


libmysql/libmysql.c:
  Auto merged
mysql-test/r/date_formats.result:
  Auto merged
mysql-test/r/insert_select.result:
  Auto merged
mysql-test/t/insert_select.test:
  Auto merged
sql/item_func.cc:
  Auto merged
sql/item_func.h:
  Auto merged
sql/item_timefunc.cc:
  Auto merged
sql/mysql_priv.h:
  Auto merged
sql/protocol.cc:
  Auto merged
sql/sql_class.h:
  Auto merged
mysql-test/r/type_datetime.result:
  Manually merged
mysql-test/t/type_datetime.test:
  Manually merged
sql/item_cmpfunc.cc:
  Manually merged
sql/item_cmpfunc.h:
  Manually merged
sql/sql_insert.cc:
  Manually merged
parents c2c760bd 17df0d64
...@@ -4352,6 +4352,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field) ...@@ -4352,6 +4352,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field)
case MYSQL_TYPE_STRING: case MYSQL_TYPE_STRING:
case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL: case MYSQL_TYPE_NEWDECIMAL:
case MYSQL_TYPE_NEWDATE:
DBUG_ASSERT(param->buffer_length != 0); DBUG_ASSERT(param->buffer_length != 0);
param->fetch_result= fetch_result_str; param->fetch_result= fetch_result_str;
break; break;
...@@ -4424,6 +4425,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field) ...@@ -4424,6 +4425,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *param, MYSQL_FIELD *field)
case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING: case MYSQL_TYPE_STRING:
case MYSQL_TYPE_BIT: case MYSQL_TYPE_BIT:
case MYSQL_TYPE_NEWDATE:
param->skip_result= skip_result_string; param->skip_result= skip_result_string;
break; break;
default: default:
......
...@@ -478,7 +478,7 @@ str_to_date(a,b) ...@@ -478,7 +478,7 @@ str_to_date(a,b)
create table t2 select str_to_date(a,b) from t1; create table t2 select str_to_date(a,b) from t1;
describe t2; describe t2;
Field Type Null Key Default Extra Field Type Null Key Default Extra
str_to_date(a,b) binary(29) YES NULL str_to_date(a,b) datetime YES NULL
select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f") as f1, select str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S.%f") as f1,
str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S") as f2, str_to_date("2003-01-02 10:11:12.0012", "%Y-%m-%d %H:%i:%S") as f2,
str_to_date("2003-01-02", "%Y-%m-%d") as f3, str_to_date("2003-01-02", "%Y-%m-%d") as f3,
......
...@@ -816,3 +816,15 @@ id prev_id join_id ...@@ -816,3 +816,15 @@ id prev_id join_id
3 2 0 3 2 0
4 3 0 4 3 0
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# Bug#30384: Having SQL_BUFFER_RESULT option in the
# CREATE .. KEY(..) .. SELECT led to creating corrupted index.
#
create table t1(f1 int);
insert into t1 values(1),(2),(3);
create table t2 (key(f1)) engine=myisam select sql_buffer_result f1 from t1;
check table t2 extended;
Table Op Msg_type Msg_text
test.t2 check status OK
drop table t1,t2;
##################################################################
...@@ -427,6 +427,67 @@ f1 ...@@ -427,6 +427,67 @@ f1
Warnings: Warnings:
Warning 1292 Incorrect datetime value: '2007010100000' for column 'f1' at row 1 Warning 1292 Incorrect datetime value: '2007010100000' for column 'f1' at row 1
drop table t1; drop table t1;
#
# Bug#27216: functions with parameters of different date types may
# return wrong type of the result.
#
create table t1 (f1 date, f2 datetime, f3 varchar(20));
create table t2 as select coalesce(f1,f1) as f4 from t1;
desc t2;
Field Type Null Key Default Extra
f4 date YES NULL
create table t3 as select coalesce(f1,f2) as f4 from t1;
desc t3;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t4 as select coalesce(f2,f2) as f4 from t1;
desc t4;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t5 as select coalesce(f1,f3) as f4 from t1;
desc t5;
Field Type Null Key Default Extra
f4 varbinary(20) YES NULL
create table t6 as select coalesce(f2,f3) as f4 from t1;
desc t6;
Field Type Null Key Default Extra
f4 varbinary(20) YES NULL
create table t7 as select coalesce(makedate(1997,1),f2) as f4 from t1;
desc t7;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t8 as select coalesce(cast('01-01-01' as datetime),f2) as f4
from t1;
desc t8;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t9 as select case when 1 then cast('01-01-01' as date)
when 0 then cast('01-01-01' as date) end as f4 from t1;
desc t9;
Field Type Null Key Default Extra
f4 date YES NULL
create table t10 as select case when 1 then cast('01-01-01' as datetime)
when 0 then cast('01-01-01' as datetime) end as f4 from t1;
desc t10;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t11 as select if(1, cast('01-01-01' as datetime),
cast('01-01-01' as date)) as f4 from t1;
desc t11;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t12 as select least(cast('01-01-01' as datetime),
cast('01-01-01' as date)) as f4 from t1;
desc t12;
Field Type Null Key Default Extra
f4 datetime YES NULL
create table t13 as select ifnull(cast('01-01-01' as datetime),
cast('01-01-01' as date)) as f4 from t1;
desc t13;
Field Type Null Key Default Extra
f4 datetime YES NULL
drop tables t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13;
###################################################################
set @org_mode=@@sql_mode; set @org_mode=@@sql_mode;
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03'); create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
Warnings: Warnings:
......
...@@ -372,3 +372,15 @@ INSERT INTO t1 (prev_id) SELECT id ...@@ -372,3 +372,15 @@ INSERT INTO t1 (prev_id) SELECT id
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1,t2; DROP TABLE t1,t2;
--echo #
--echo # Bug#30384: Having SQL_BUFFER_RESULT option in the
--echo # CREATE .. KEY(..) .. SELECT led to creating corrupted index.
--echo #
create table t1(f1 int);
insert into t1 values(1),(2),(3);
create table t2 (key(f1)) engine=myisam select sql_buffer_result f1 from t1;
check table t2 extended;
drop table t1,t2;
--echo ##################################################################
...@@ -283,6 +283,43 @@ select * from t1 where f1 between 2002010 and 20070101000000; ...@@ -283,6 +283,43 @@ select * from t1 where f1 between 2002010 and 20070101000000;
select * from t1 where f1 between 20020101 and 2007010100000; select * from t1 where f1 between 20020101 and 2007010100000;
drop table t1; drop table t1;
--echo #
--echo # Bug#27216: functions with parameters of different date types may
--echo # return wrong type of the result.
--echo #
create table t1 (f1 date, f2 datetime, f3 varchar(20));
create table t2 as select coalesce(f1,f1) as f4 from t1;
desc t2;
create table t3 as select coalesce(f1,f2) as f4 from t1;
desc t3;
create table t4 as select coalesce(f2,f2) as f4 from t1;
desc t4;
create table t5 as select coalesce(f1,f3) as f4 from t1;
desc t5;
create table t6 as select coalesce(f2,f3) as f4 from t1;
desc t6;
create table t7 as select coalesce(makedate(1997,1),f2) as f4 from t1;
desc t7;
create table t8 as select coalesce(cast('01-01-01' as datetime),f2) as f4
from t1;
desc t8;
create table t9 as select case when 1 then cast('01-01-01' as date)
when 0 then cast('01-01-01' as date) end as f4 from t1;
desc t9;
create table t10 as select case when 1 then cast('01-01-01' as datetime)
when 0 then cast('01-01-01' as datetime) end as f4 from t1;
desc t10;
create table t11 as select if(1, cast('01-01-01' as datetime),
cast('01-01-01' as date)) as f4 from t1;
desc t11;
create table t12 as select least(cast('01-01-01' as datetime),
cast('01-01-01' as date)) as f4 from t1;
desc t12;
create table t13 as select ifnull(cast('01-01-01' as datetime),
cast('01-01-01' as date)) as f4 from t1;
desc t13;
drop tables t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13;
--echo ###################################################################
# #
# Test of storing datetime into date fields # Test of storing datetime into date fields
# #
......
...@@ -146,6 +146,35 @@ static int agg_cmp_type(Item_result *type, Item **items, uint nitems) ...@@ -146,6 +146,35 @@ static int agg_cmp_type(Item_result *type, Item **items, uint nitems)
} }
/**
@brief Aggregates field types from the array of items.
@param[in] items array of items to aggregate the type from
@paran[in] nitems number of items in the array
@details This function aggregates field types from the array of items.
Found type is supposed to be used later as the result field type
of a multi-argument function.
Aggregation itself is performed by the Field::field_type_merge()
function.
@note The term "aggregation" is used here in the sense of inferring the
result type of a function from its argument types.
@return aggregated field type.
*/
enum_field_types agg_field_type(Item **items, uint nitems)
{
uint i;
if (!nitems || items[0]->result_type() == ROW_RESULT )
return (enum_field_types)-1;
enum_field_types res= items[0]->field_type();
for (i= 1 ; i < nitems ; i++)
res= Field::field_type_merge(res, items[i]->field_type());
return res;
}
/* /*
Collects different types for comparison of first item with each other items Collects different types for comparison of first item with each other items
...@@ -2065,9 +2094,7 @@ Item_func_ifnull::fix_length_and_dec() ...@@ -2065,9 +2094,7 @@ Item_func_ifnull::fix_length_and_dec()
default: default:
DBUG_ASSERT(0); DBUG_ASSERT(0);
} }
cached_field_type= args[0]->field_type(); cached_field_type= agg_field_type(args, 2);
if (cached_field_type != args[1]->field_type())
cached_field_type= Item_func::field_type();
} }
...@@ -2215,11 +2242,13 @@ Item_func_if::fix_length_and_dec() ...@@ -2215,11 +2242,13 @@ Item_func_if::fix_length_and_dec()
{ {
cached_result_type= arg2_type; cached_result_type= arg2_type;
collation.set(args[2]->collation.collation); collation.set(args[2]->collation.collation);
cached_field_type= args[2]->field_type();
} }
else if (null2) else if (null2)
{ {
cached_result_type= arg1_type; cached_result_type= arg1_type;
collation.set(args[1]->collation.collation); collation.set(args[1]->collation.collation);
cached_field_type= args[1]->field_type();
} }
else else
{ {
...@@ -2233,6 +2262,7 @@ Item_func_if::fix_length_and_dec() ...@@ -2233,6 +2262,7 @@ Item_func_if::fix_length_and_dec()
{ {
collation.set(&my_charset_bin); // Number collation.set(&my_charset_bin); // Number
} }
cached_field_type= agg_field_type(args + 1, 2);
} }
if ((cached_result_type == DECIMAL_RESULT ) if ((cached_result_type == DECIMAL_RESULT )
...@@ -2582,7 +2612,7 @@ void Item_func_case::fix_length_and_dec() ...@@ -2582,7 +2612,7 @@ void Item_func_case::fix_length_and_dec()
agg_arg_charsets(collation, agg, nagg, MY_COLL_ALLOW_CONV, 1)) agg_arg_charsets(collation, agg, nagg, MY_COLL_ALLOW_CONV, 1))
return; return;
cached_field_type= agg_field_type(agg, nagg);
/* /*
Aggregate first expression and all THEN expression types Aggregate first expression and all THEN expression types
and collations when string comparison and collations when string comparison
...@@ -2751,6 +2781,7 @@ my_decimal *Item_func_coalesce::decimal_op(my_decimal *decimal_value) ...@@ -2751,6 +2781,7 @@ my_decimal *Item_func_coalesce::decimal_op(my_decimal *decimal_value)
void Item_func_coalesce::fix_length_and_dec() void Item_func_coalesce::fix_length_and_dec()
{ {
cached_field_type= agg_field_type(args, arg_count);
agg_result_type(&hybrid_type, args, arg_count); agg_result_type(&hybrid_type, args, arg_count);
switch (hybrid_type) { switch (hybrid_type) {
case STRING_RESULT: case STRING_RESULT:
......
...@@ -640,6 +640,7 @@ public: ...@@ -640,6 +640,7 @@ public:
class Item_func_coalesce :public Item_func_numhybrid class Item_func_coalesce :public Item_func_numhybrid
{ {
protected: protected:
enum_field_types cached_field_type;
Item_func_coalesce(Item *a, Item *b) :Item_func_numhybrid(a, b) {} Item_func_coalesce(Item *a, Item *b) :Item_func_numhybrid(a, b) {}
public: public:
Item_func_coalesce(List<Item> &list) :Item_func_numhybrid(list) {} Item_func_coalesce(List<Item> &list) :Item_func_numhybrid(list) {}
...@@ -652,13 +653,13 @@ public: ...@@ -652,13 +653,13 @@ public:
enum Item_result result_type () const { return hybrid_type; } enum Item_result result_type () const { return hybrid_type; }
const char *func_name() const { return "coalesce"; } const char *func_name() const { return "coalesce"; }
table_map not_null_tables() const { return 0; } table_map not_null_tables() const { return 0; }
enum_field_types field_type() const { return cached_field_type; }
}; };
class Item_func_ifnull :public Item_func_coalesce class Item_func_ifnull :public Item_func_coalesce
{ {
protected: protected:
enum_field_types cached_field_type;
bool field_type_defined; bool field_type_defined;
public: public:
Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {} Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
...@@ -677,6 +678,7 @@ public: ...@@ -677,6 +678,7 @@ public:
class Item_func_if :public Item_func class Item_func_if :public Item_func
{ {
enum Item_result cached_result_type; enum Item_result cached_result_type;
enum_field_types cached_field_type;
public: public:
Item_func_if(Item *a,Item *b,Item *c) Item_func_if(Item *a,Item *b,Item *c)
:Item_func(a,b,c), cached_result_type(INT_RESULT) :Item_func(a,b,c), cached_result_type(INT_RESULT)
...@@ -686,6 +688,7 @@ public: ...@@ -686,6 +688,7 @@ public:
String *val_str(String *str); String *val_str(String *str);
my_decimal *val_decimal(my_decimal *); my_decimal *val_decimal(my_decimal *);
enum Item_result result_type () const { return cached_result_type; } enum Item_result result_type () const { return cached_result_type; }
enum_field_types field_type() const { return cached_field_type; }
bool fix_fields(THD *, Item **); bool fix_fields(THD *, Item **);
void fix_length_and_dec(); void fix_length_and_dec();
uint decimal_precision() const; uint decimal_precision() const;
...@@ -713,6 +716,7 @@ public: ...@@ -713,6 +716,7 @@ public:
bool is_null(); bool is_null();
}; };
/* Functions to handle the optimized IN */ /* Functions to handle the optimized IN */
...@@ -1442,6 +1446,7 @@ public: ...@@ -1442,6 +1446,7 @@ public:
Item *transform(Item_transformer transformer, uchar *arg); Item *transform(Item_transformer transformer, uchar *arg);
void traverse_cond(Cond_traverser, void *arg, traverse_order order); void traverse_cond(Cond_traverser, void *arg, traverse_order order);
void neg_arguments(THD *thd); void neg_arguments(THD *thd);
enum_field_types field_type() const { return MYSQL_TYPE_LONGLONG; }
bool subst_argument_checker(uchar **arg) { return TRUE; } bool subst_argument_checker(uchar **arg) { return TRUE; }
Item *compile(Item_analyzer analyzer, uchar **arg_p, Item *compile(Item_analyzer analyzer, uchar **arg_p,
Item_transformer transformer, uchar *arg_t); Item_transformer transformer, uchar *arg_t);
......
...@@ -2238,6 +2238,7 @@ void Item_func_min_max::fix_length_and_dec() ...@@ -2238,6 +2238,7 @@ void Item_func_min_max::fix_length_and_dec()
else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT)) else if ((cmp_type == DECIMAL_RESULT) || (cmp_type == INT_RESULT))
max_length= my_decimal_precision_to_length(max_int_part+decimals, decimals, max_length= my_decimal_precision_to_length(max_int_part+decimals, decimals,
unsigned_flag); unsigned_flag);
cached_field_type= agg_field_type(args, arg_count);
} }
......
...@@ -699,7 +699,8 @@ class Item_func_min_max :public Item_func ...@@ -699,7 +699,8 @@ class Item_func_min_max :public Item_func
/* An item used for issuing warnings while string to DATETIME conversion. */ /* An item used for issuing warnings while string to DATETIME conversion. */
Item *datetime_item; Item *datetime_item;
THD *thd; THD *thd;
protected:
enum_field_types cached_field_type;
public: public:
Item_func_min_max(List<Item> &list,int cmp_sign_arg) :Item_func(list), Item_func_min_max(List<Item> &list,int cmp_sign_arg) :Item_func(list),
cmp_type(INT_RESULT), cmp_sign(cmp_sign_arg), compare_as_dates(FALSE), cmp_type(INT_RESULT), cmp_sign(cmp_sign_arg), compare_as_dates(FALSE),
...@@ -712,6 +713,7 @@ public: ...@@ -712,6 +713,7 @@ public:
enum Item_result result_type () const { return cmp_type; } enum Item_result result_type () const { return cmp_type; }
bool result_as_longlong() { return compare_as_dates; }; bool result_as_longlong() { return compare_as_dates; };
uint cmp_datetimes(ulonglong *value); uint cmp_datetimes(ulonglong *value);
enum_field_types field_type() const { return cached_field_type; }
}; };
class Item_func_min :public Item_func_min_max class Item_func_min :public Item_func_min_max
......
...@@ -3239,7 +3239,7 @@ void Item_func_str_to_date::fix_length_and_dec() ...@@ -3239,7 +3239,7 @@ void Item_func_str_to_date::fix_length_and_dec()
String format_str(format_buff, sizeof(format_buff), &my_charset_bin), *format; String format_str(format_buff, sizeof(format_buff), &my_charset_bin), *format;
maybe_null= 1; maybe_null= 1;
decimals=0; decimals=0;
cached_field_type= MYSQL_TYPE_STRING; cached_field_type= MYSQL_TYPE_DATETIME;
max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN; max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
cached_timestamp_type= MYSQL_TIMESTAMP_NONE; cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
format= args[1]->val_str(&format_str); format= args[1]->val_str(&format_str);
......
...@@ -1673,6 +1673,7 @@ void flush_thread_cache(); ...@@ -1673,6 +1673,7 @@ void flush_thread_cache();
/* item_func.cc */ /* item_func.cc */
extern bool check_reserved_words(LEX_STRING *name); extern bool check_reserved_words(LEX_STRING *name);
extern enum_field_types agg_field_type(Item **items, uint nitems);
/* strfunc.cc */ /* strfunc.cc */
ulonglong find_set(TYPELIB *lib, const char *x, uint length, CHARSET_INFO *cs, ulonglong find_set(TYPELIB *lib, const char *x, uint length, CHARSET_INFO *cs,
......
...@@ -827,6 +827,7 @@ bool Protocol_text::store(const char *from, size_t length, ...@@ -827,6 +827,7 @@ bool Protocol_text::store(const char *from, size_t length,
field_types[field_pos] == MYSQL_TYPE_DECIMAL || field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
field_types[field_pos] == MYSQL_TYPE_BIT || field_types[field_pos] == MYSQL_TYPE_BIT ||
field_types[field_pos] == MYSQL_TYPE_NEWDECIMAL || field_types[field_pos] == MYSQL_TYPE_NEWDECIMAL ||
field_types[field_pos] == MYSQL_TYPE_NEWDATE ||
(field_types[field_pos] >= MYSQL_TYPE_ENUM && (field_types[field_pos] >= MYSQL_TYPE_ENUM &&
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY)); field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
field_pos++; field_pos++;
......
...@@ -2107,7 +2107,7 @@ class select_insert :public select_result_interceptor { ...@@ -2107,7 +2107,7 @@ class select_insert :public select_result_interceptor {
ulonglong autoinc_value_of_last_inserted_row; // autogenerated or not ulonglong autoinc_value_of_last_inserted_row; // autogenerated or not
COPY_INFO info; COPY_INFO info;
bool insert_into_view; bool insert_into_view;
bool is_bulk_insert_mode;
select_insert(TABLE_LIST *table_list_par, select_insert(TABLE_LIST *table_list_par,
TABLE *table_par, List<Item> *fields_par, TABLE *table_par, List<Item> *fields_par,
List<Item> *update_fields, List<Item> *update_values, List<Item> *update_fields, List<Item> *update_values,
......
...@@ -2778,7 +2778,8 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par, ...@@ -2778,7 +2778,8 @@ select_insert::select_insert(TABLE_LIST *table_list_par, TABLE *table_par,
bool ignore_check_option_errors) bool ignore_check_option_errors)
:table_list(table_list_par), table(table_par), fields(fields_par), :table_list(table_list_par), table(table_par), fields(fields_par),
autoinc_value_of_last_inserted_row(0), autoinc_value_of_last_inserted_row(0),
insert_into_view(table_list_par && table_list_par->view != 0) insert_into_view(table_list_par && table_list_par->view != 0),
is_bulk_insert_mode(FALSE)
{ {
bzero((char*) &info,sizeof(info)); bzero((char*) &info,sizeof(info));
info.handle_duplicates= duplic; info.handle_duplicates= duplic;
...@@ -2964,8 +2965,11 @@ int select_insert::prepare2(void) ...@@ -2964,8 +2965,11 @@ int select_insert::prepare2(void)
{ {
DBUG_ENTER("select_insert::prepare2"); DBUG_ENTER("select_insert::prepare2");
if (thd->lex->current_select->options & OPTION_BUFFER_RESULT && if (thd->lex->current_select->options & OPTION_BUFFER_RESULT &&
!thd->prelocked_mode) !thd->prelocked_mode && !is_bulk_insert_mode)
{
table->file->ha_start_bulk_insert((ha_rows) 0); table->file->ha_start_bulk_insert((ha_rows) 0);
is_bulk_insert_mode= TRUE;
}
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -3084,6 +3088,7 @@ bool select_insert::send_eof() ...@@ -3084,6 +3088,7 @@ bool select_insert::send_eof()
trans_table, table->file->table_type())); trans_table, table->file->table_type()));
error= (!thd->prelocked_mode) ? table->file->ha_end_bulk_insert():0; error= (!thd->prelocked_mode) ? table->file->ha_end_bulk_insert():0;
is_bulk_insert_mode= FALSE;
table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY);
table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE); table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE);
...@@ -3307,7 +3312,10 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, ...@@ -3307,7 +3312,10 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
Create_field *cr_field; Create_field *cr_field;
Field *field, *def_field; Field *field, *def_field;
if (item->type() == Item::FUNC_ITEM) if (item->type() == Item::FUNC_ITEM)
if (item->result_type() != STRING_RESULT)
field= item->tmp_table_field(&tmp_table); field= item->tmp_table_field(&tmp_table);
else
field= item->tmp_table_field_from_field_type(&tmp_table);
else else
field= create_tmp_field(thd, &tmp_table, item, item->type(), field= create_tmp_field(thd, &tmp_table, item, item->type(),
(Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0, (Item ***) 0, &tmp_field, &def_field, 0, 0, 0, 0,
...@@ -3518,7 +3526,10 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u) ...@@ -3518,7 +3526,10 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
if (info.handle_duplicates == DUP_UPDATE) if (info.handle_duplicates == DUP_UPDATE)
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE); table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
if (!thd->prelocked_mode) if (!thd->prelocked_mode)
{
table->file->ha_start_bulk_insert((ha_rows) 0); table->file->ha_start_bulk_insert((ha_rows) 0);
is_bulk_insert_mode= TRUE;
}
thd->abort_on_warning= (!info.ignore && thd->abort_on_warning= (!info.ignore &&
(thd->variables.sql_mode & (thd->variables.sql_mode &
(MODE_STRICT_TRANS_TABLES | (MODE_STRICT_TRANS_TABLES |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment