Commit a2261d57 authored by evgen@moonbone.local's avatar evgen@moonbone.local

Many files:

  After merge fix
parent e35a0ca4
...@@ -254,7 +254,7 @@ cast("2001-1-1" as datetime) = "2001-01-01 00:00:00" ...@@ -254,7 +254,7 @@ cast("2001-1-1" as datetime) = "2001-01-01 00:00:00"
1 1
select cast("1:2:3" as TIME) = "1:02:03"; select cast("1:2:3" as TIME) = "1:02:03";
cast("1:2:3" as TIME) = "1:02:03" cast("1:2:3" as TIME) = "1:02:03"
1 0
select cast(NULL as DATE); select cast(NULL as DATE);
cast(NULL as DATE) cast(NULL as DATE)
NULL NULL
......
...@@ -68,13 +68,6 @@ select 'a' union select concat('a', -0.0000); ...@@ -68,13 +68,6 @@ select 'a' union select concat('a', -0.0000);
a a
a a
a0.0000 a0.0000
create table t1(f1 varchar(6)) charset=utf8;
insert into t1 values ("123456");
select concat(f1, 2) a from t1 union select 'x' a from t1;
a
1234562
x
drop table t1;
select concat((select x from (select 'a' as x) as t1 ), select concat((select x from (select 'a' as x) as t1 ),
(select y from (select 'b' as y) as t2 )) from (select 1 union select 2 ) (select y from (select 'b' as y) as t2 )) from (select 1 union select 2 )
as t3; as t3;
...@@ -82,3 +75,10 @@ concat((select x from (select 'a' as x) as t1 ), ...@@ -82,3 +75,10 @@ concat((select x from (select 'a' as x) as t1 ),
(select y from (select 'b' as y) as t2 )) (select y from (select 'b' as y) as t2 ))
ab ab
ab ab
create table t1(f1 varchar(6)) charset=utf8;
insert into t1 values ("123456");
select concat(f1, 2) a from t1 union select 'x' a from t1;
a
1234562
x
drop table t1;
...@@ -784,7 +784,9 @@ f1 ...@@ -784,7 +784,9 @@ f1
select f1 from t1 where "2006-1-1" between f1 and 'zzz'; select f1 from t1 where "2006-1-1" between f1 and 'zzz';
f1 f1
Warnings: Warnings:
Warning 1292 Truncated incorrect date value: 'zzz' Warning 1292 Incorrect date value: 'zzz' for column 'f1' at row 1
Warning 1292 Truncated incorrect INTEGER value: 'zzz'
Warning 1292 Truncated incorrect INTEGER value: 'zzz'
select f1 from t1 where makedate(2006,1) between date(f1) and date(f3); select f1 from t1 where makedate(2006,1) between date(f1) and date(f3);
f1 f1
2006-01-01 2006-01-01
......
...@@ -4530,11 +4530,11 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -4530,11 +4530,11 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
int error; int error;
bool have_smth_to_conv; bool have_smth_to_conv;
my_bool in_dst_time_gap; my_bool in_dst_time_gap;
THD *thd= table->in_use; THD *thd= table ? table->in_use : current_thd;
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */ /* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
have_smth_to_conv= (str_to_datetime(from, len, &l_time, have_smth_to_conv= (str_to_datetime(from, len, &l_time,
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
MODE_NO_ZERO_DATE) | MODE_NO_ZERO_DATE) |
MODE_NO_ZERO_IN_DATE, &error) > MODE_NO_ZERO_IN_DATE, &error) >
MYSQL_TIMESTAMP_ERROR); MYSQL_TIMESTAMP_ERROR);
...@@ -4599,7 +4599,7 @@ int Field_timestamp::store(longlong nr, bool unsigned_val) ...@@ -4599,7 +4599,7 @@ int Field_timestamp::store(longlong nr, bool unsigned_val)
my_time_t timestamp= 0; my_time_t timestamp= 0;
int error; int error;
my_bool in_dst_time_gap; my_bool in_dst_time_gap;
THD *thd= table->in_use; THD *thd= table ? table->in_use : current_thd;
/* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */ /* We don't want to store invalid or fuzzy datetime values in TIMESTAMP */
longlong tmp= number_to_datetime(nr, &l_time, (thd->variables.sql_mode & longlong tmp= number_to_datetime(nr, &l_time, (thd->variables.sql_mode &
...@@ -4653,7 +4653,7 @@ longlong Field_timestamp::val_int(void) ...@@ -4653,7 +4653,7 @@ longlong Field_timestamp::val_int(void)
{ {
uint32 temp; uint32 temp;
TIME time_tmp; TIME time_tmp;
THD *thd= table->in_use; THD *thd= table ? table->in_use : current_thd;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first) if (table->s->db_low_byte_first)
...@@ -4678,7 +4678,7 @@ String *Field_timestamp::val_str(String *val_buffer, String *val_ptr) ...@@ -4678,7 +4678,7 @@ String *Field_timestamp::val_str(String *val_buffer, String *val_ptr)
{ {
uint32 temp, temp2; uint32 temp, temp2;
TIME time_tmp; TIME time_tmp;
THD *thd= table->in_use; THD *thd= table ? table->in_use : current_thd;
char *to; char *to;
val_buffer->alloc(field_length+1); val_buffer->alloc(field_length+1);
...@@ -4749,7 +4749,7 @@ String *Field_timestamp::val_str(String *val_buffer, String *val_ptr) ...@@ -4749,7 +4749,7 @@ String *Field_timestamp::val_str(String *val_buffer, String *val_ptr)
bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate) bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate)
{ {
long temp; long temp;
THD *thd= table->in_use; THD *thd= table ? table->in_use : current_thd;
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first) if (table->s->db_low_byte_first)
temp=uint4korr(ptr); temp=uint4korr(ptr);
...@@ -4832,7 +4832,8 @@ void Field_timestamp::sql_type(String &res) const ...@@ -4832,7 +4832,8 @@ void Field_timestamp::sql_type(String &res) const
void Field_timestamp::set_time() void Field_timestamp::set_time()
{ {
long tmp= (long) table->in_use->query_start(); THD *thd= table ? table->in_use : current_thd;
long tmp= (long) thd->query_start();
set_notnull(); set_notnull();
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first) if (table->s->db_low_byte_first)
...@@ -5024,12 +5025,13 @@ String *Field_time::val_str(String *val_buffer, ...@@ -5024,12 +5025,13 @@ String *Field_time::val_str(String *val_buffer,
bool Field_time::get_date(TIME *ltime, uint fuzzydate) bool Field_time::get_date(TIME *ltime, uint fuzzydate)
{ {
long tmp; long tmp;
THD *thd= table ? table->in_use : current_thd;
if (!(fuzzydate & TIME_FUZZY_DATE)) if (!(fuzzydate & TIME_FUZZY_DATE))
{ {
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_WARN_DATA_OUT_OF_RANGE, ER_WARN_DATA_OUT_OF_RANGE,
ER(ER_WARN_DATA_OUT_OF_RANGE), field_name, ER(ER_WARN_DATA_OUT_OF_RANGE), field_name,
table->in_use->row_count); thd->row_count);
return 1; return 1;
} }
tmp=(long) sint3korr(ptr); tmp=(long) sint3korr(ptr);
...@@ -5217,9 +5219,10 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs) ...@@ -5217,9 +5219,10 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
TIME l_time; TIME l_time;
uint32 tmp; uint32 tmp;
int error; int error;
THD *thd= table ? table->in_use : current_thd;
if (str_to_datetime(from, len, &l_time, TIME_FUZZY_DATE | if (str_to_datetime(from, len, &l_time, TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES)), MODE_INVALID_DATES)),
&error) <= MYSQL_TIMESTAMP_ERROR) &error) <= MYSQL_TIMESTAMP_ERROR)
...@@ -5272,9 +5275,10 @@ int Field_date::store(longlong nr, bool unsigned_val) ...@@ -5272,9 +5275,10 @@ int Field_date::store(longlong nr, bool unsigned_val)
TIME not_used; TIME not_used;
int error; int error;
longlong initial_nr= nr; longlong initial_nr= nr;
THD *thd= table ? table->in_use : current_thd;
nr= number_to_datetime(nr, &not_used, (TIME_FUZZY_DATE | nr= number_to_datetime(nr, &not_used, (TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | (MODE_NO_ZERO_IN_DATE |
MODE_NO_ZERO_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), &error); MODE_INVALID_DATES))), &error);
...@@ -5420,9 +5424,10 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -5420,9 +5424,10 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
TIME l_time; TIME l_time;
long tmp; long tmp;
int error; int error;
THD *thd= table ? table->in_use : current_thd;
if (str_to_datetime(from, len, &l_time, if (str_to_datetime(from, len, &l_time,
(TIME_FUZZY_DATE | (TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), MODE_INVALID_DATES))),
&error) <= MYSQL_TIMESTAMP_ERROR) &error) <= MYSQL_TIMESTAMP_ERROR)
...@@ -5460,9 +5465,10 @@ int Field_newdate::store(longlong nr, bool unsigned_val) ...@@ -5460,9 +5465,10 @@ int Field_newdate::store(longlong nr, bool unsigned_val)
TIME l_time; TIME l_time;
longlong tmp; longlong tmp;
int error; int error;
THD *thd= table ? table->in_use : current_thd;
if (number_to_datetime(nr, &l_time, if (number_to_datetime(nr, &l_time,
(TIME_FUZZY_DATE | (TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), MODE_INVALID_DATES))),
&error) == LL(-1)) &error) == LL(-1))
...@@ -5605,10 +5611,11 @@ int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) ...@@ -5605,10 +5611,11 @@ int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
int error; int error;
ulonglong tmp= 0; ulonglong tmp= 0;
enum enum_mysql_timestamp_type func_res; enum enum_mysql_timestamp_type func_res;
THD *thd= table ? table->in_use : current_thd;
func_res= str_to_datetime(from, len, &time_tmp, func_res= str_to_datetime(from, len, &time_tmp,
(TIME_FUZZY_DATE | (TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE | (MODE_NO_ZERO_IN_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), MODE_INVALID_DATES))),
&error); &error);
...@@ -5655,9 +5662,10 @@ int Field_datetime::store(longlong nr, bool unsigned_val) ...@@ -5655,9 +5662,10 @@ int Field_datetime::store(longlong nr, bool unsigned_val)
TIME not_used; TIME not_used;
int error; int error;
longlong initial_nr= nr; longlong initial_nr= nr;
THD *thd= table ? table->in_use : current_thd;
nr= number_to_datetime(nr, &not_used, (TIME_FUZZY_DATE | nr= number_to_datetime(nr, &not_used, (TIME_FUZZY_DATE |
(table->in_use->variables.sql_mode & (thd->variables.sql_mode &
(MODE_NO_ZERO_IN_DATE | (MODE_NO_ZERO_IN_DATE |
MODE_NO_ZERO_DATE | MODE_NO_ZERO_DATE |
MODE_INVALID_DATES))), &error); MODE_INVALID_DATES))), &error);
...@@ -9076,10 +9084,10 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code, ...@@ -9076,10 +9084,10 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code,
const char *str, uint str_length, const char *str, uint str_length,
timestamp_type ts_type, int cuted_increment) timestamp_type ts_type, int cuted_increment)
{ {
if (table->in_use->really_abort_on_warning() || THD *thd= table ? table->in_use : current_thd;
if (thd->really_abort_on_warning() ||
set_warning(level, code, cuted_increment)) set_warning(level, code, cuted_increment))
make_truncated_value_warning(table ? table->in_use : current_thd, make_truncated_value_warning(thd, str, str_length, ts_type,
str, str_length, ts_type,
field_name); field_name);
} }
...@@ -9106,13 +9114,13 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code, ...@@ -9106,13 +9114,13 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code,
longlong nr, timestamp_type ts_type, longlong nr, timestamp_type ts_type,
int cuted_increment) int cuted_increment)
{ {
if (table->in_use->really_abort_on_warning() || THD *thd= table ? table->in_use : current_thd;
if (thd->really_abort_on_warning() ||
set_warning(level, code, cuted_increment)) set_warning(level, code, cuted_increment))
{ {
char str_nr[22]; char str_nr[22];
char *str_end= longlong10_to_str(nr, str_nr, -10); char *str_end= longlong10_to_str(nr, str_nr, -10);
make_truncated_value_warning(table ? table->in_use : current_thd, make_truncated_value_warning(thd, str_nr, (uint) (str_end - str_nr),
str_nr, (uint) (str_end - str_nr),
ts_type, field_name); ts_type, field_name);
} }
} }
...@@ -9138,41 +9146,15 @@ void ...@@ -9138,41 +9146,15 @@ void
Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code, Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code,
double nr, timestamp_type ts_type) double nr, timestamp_type ts_type)
{ {
if (table->in_use->really_abort_on_warning() || THD *thd= table ? table->in_use : current_thd;
if (thd->really_abort_on_warning() ||
set_warning(level, code, 1)) set_warning(level, code, 1))
{ {
/* DBL_DIG is enough to print '-[digits].E+###' */ /* DBL_DIG is enough to print '-[digits].E+###' */
char str_nr[DBL_DIG + 8]; char str_nr[DBL_DIG + 8];
uint str_len= my_sprintf(str_nr, (str_nr, "%g", nr)); uint str_len= my_sprintf(str_nr, (str_nr, "%g", nr));
make_truncated_value_warning(table ? table->in_use : current_thd, make_truncated_value_warning(thd, str_nr, str_len, ts_type,
str_nr, str_len, ts_type,
field_name); field_name);
} }
} }
/*
maximum possible display length for blob
SYNOPSIS
Field_blob::max_length()
RETURN
length
*/
uint32 Field_blob::max_length()
{
switch (packlength)
{
case 1:
return 255 * field_charset->mbmaxlen;
case 2:
return 65535 * field_charset->mbmaxlen;
case 3:
return 16777215 * field_charset->mbmaxlen;
case 4:
return (uint32) 4294967295U;
default:
DBUG_ASSERT(0); // we should never go here
return 0;
}
}
...@@ -366,18 +366,18 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item) ...@@ -366,18 +366,18 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item)
if (!(*item)->with_subselect && (*item)->const_item()) if (!(*item)->with_subselect && (*item)->const_item())
{ {
/* For comparison purposes allow invalid dates like 2000-01-32 */ /* For comparison purposes allow invalid dates like 2000-01-32 */
ulong orig_sql_mode= field->table->in_use->variables.sql_mode; ulong orig_sql_mode= thd->variables.sql_mode;
field->table->in_use->variables.sql_mode|= MODE_INVALID_DATES; thd->variables.sql_mode|= MODE_INVALID_DATES;
if (!(*item)->save_in_field(field, 1) && !((*item)->null_value)) if (!(*item)->save_in_field(field, 1) && !((*item)->null_value))
{ {
Item *tmp=new Item_int_with_ref(field->val_int(), *item, Item *tmp=new Item_int_with_ref(field->val_int(), *item,
test(field->flags & UNSIGNED_FLAG)); test(field->flags & UNSIGNED_FLAG));
field->table->in_use->variables.sql_mode= orig_sql_mode; thd->variables.sql_mode= orig_sql_mode;
if (tmp) if (tmp)
thd->change_item_tree(item, tmp); thd->change_item_tree(item, tmp);
return 1; // Item was replaced return 1; // Item was replaced
} }
field->table->in_use->variables.sql_mode= orig_sql_mode; thd->variables.sql_mode= orig_sql_mode;
} }
return 0; return 0;
} }
......
...@@ -45,11 +45,8 @@ public: ...@@ -45,11 +45,8 @@ public:
int set_compare_func(Item_bool_func2 *owner, Item_result type); int set_compare_func(Item_bool_func2 *owner, Item_result type);
inline int set_compare_func(Item_bool_func2 *owner_arg) inline int set_compare_func(Item_bool_func2 *owner_arg)
{ {
Item_result ar= (*a)->result_as_longlong() && (*b)->const_item() ? return set_compare_func(owner_arg, item_cmp_type((*a)->result_type(),
INT_RESULT : (*a)->result_type(); (*b)->result_type()));
Item_result br= (*b)->result_as_longlong() && (*a)->const_item() ?
INT_RESULT : (*b)->result_type();
return set_compare_func(owner_arg, item_cmp_type(ar, br));
} }
inline int set_cmp_func(Item_bool_func2 *owner_arg, inline int set_cmp_func(Item_bool_func2 *owner_arg,
Item **a1, Item **a2, Item **a1, Item **a2,
...@@ -62,11 +59,9 @@ public: ...@@ -62,11 +59,9 @@ public:
inline int set_cmp_func(Item_bool_func2 *owner_arg, inline int set_cmp_func(Item_bool_func2 *owner_arg,
Item **a1, Item **a2) Item **a1, Item **a2)
{ {
Item_result ar= (*a1)->result_as_longlong() && (*a2)->const_item() ? return set_cmp_func(owner_arg, a1, a2,
INT_RESULT : (*a1)->result_type(); item_cmp_type((*a1)->result_type(),
Item_result br= (*a2)->result_as_longlong() && (*a1)->const_item() ? (*a2)->result_type()));
INT_RESULT : (*a2)->result_type();
return set_cmp_func(owner_arg, a1, a2, item_cmp_type(ar, br));
} }
inline int compare() { return (this->*func)(); } inline int compare() { return (this->*func)(); }
......
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