Commit 53b3ebdf authored by unknown's avatar unknown

Fixed Bug#3115. CAST AS DATE with malformed string returns NULL but IS NULL

is false.


BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
parent 23f9f229
...@@ -59,6 +59,7 @@ jani@rhols221.arenanet.fi ...@@ -59,6 +59,7 @@ jani@rhols221.arenanet.fi
jani@ua126d19.elisa.omakaista.fi jani@ua126d19.elisa.omakaista.fi
jani@ua141d10.elisa.omakaista.fi jani@ua141d10.elisa.omakaista.fi
jani@ua167d18.elisa.omakaista.fi jani@ua167d18.elisa.omakaista.fi
jani@ua72d24.elisa.omakaista.fi
jcole@abel.spaceapes.com jcole@abel.spaceapes.com
jcole@main.burghcom.com jcole@main.burghcom.com
jcole@mugatu.spaceapes.com jcole@mugatu.spaceapes.com
......
...@@ -104,9 +104,9 @@ drop table t2; ...@@ -104,9 +104,9 @@ drop table t2;
create table t2 select CAST("2001-12-29" AS DATE) as d, CAST("20:45:11" AS TIME) as t, CAST("2001-12-29 20:45:11" AS DATETIME) as dt; create table t2 select CAST("2001-12-29" AS DATE) as d, CAST("20:45:11" AS TIME) as t, CAST("2001-12-29 20:45:11" AS DATETIME) as dt;
describe t2; describe t2;
Field Type Null Key Default Extra Field Type Null Key Default Extra
d date 0000-00-00 d date YES NULL
t time 00:00:00 t time YES NULL
dt datetime 0000-00-00 00:00:00 dt datetime YES NULL
drop table t1,t2; drop table t1,t2;
create table t1 (a tinyint); create table t1 (a tinyint);
create table t2 (a int) select * from t1; create table t2 (a int) select * from t1;
...@@ -396,12 +396,12 @@ Field Type Null Key Default Extra ...@@ -396,12 +396,12 @@ Field Type Null Key Default Extra
a int(11) YES NULL a int(11) YES NULL
b bigint(11) 0 b bigint(11) 0
c bigint(10) 0 c bigint(10) 0
d date 0000-00-00 d date YES NULL
e char(1) e char(1)
f datetime 0000-00-00 00:00:00 f datetime YES NULL
g time 00:00:00 g time YES NULL
h longblob h longblob
dd time 00:00:00 dd time YES NULL
select * from t2; select * from t2;
a b c d e f g h dd a b c d e f g h dd
1 -7 7 2000-01-01 b 2000-01-01 00:00:00 05:04:03 yet another binary data 02:00:00 1 -7 7 2000-01-01 b 2000-01-01 00:00:00 05:04:03 yet another binary data 02:00:00
......
...@@ -159,14 +159,14 @@ time("1997-12-31 23:59:59.000001") as f9; ...@@ -159,14 +159,14 @@ time("1997-12-31 23:59:59.000001") as f9;
describe t1; describe t1;
Field Type Null Key Default Extra Field Type Null Key Default Extra
f1 date 0000-00-00 f1 date 0000-00-00
f2 datetime 0000-00-00 00:00:00 f2 datetime YES NULL
f3 time 00:00:00 f3 time YES NULL
f4 time 00:00:00 f4 time 00:00:00
f5 time 00:00:00 f5 time 00:00:00
f6 time 00:00:00 f6 time 00:00:00
f7 datetime 0000-00-00 00:00:00 f7 datetime YES NULL
f8 date 0000-00-00 f8 date YES NULL
f9 time 00:00:00 f9 time YES NULL
select * from t1; select * from t1;
f1 f2 f3 f4 f5 f6 f7 f8 f9 f1 f2 f3 f4 f5 f6 f7 f8 f9
1997-01-01 1998-01-02 01:01:00 49:01:01 46:58:57 -23:59:59 10:11:12 2001-12-01 01:01:01 1997-12-31 23:59:59 1997-01-01 1998-01-02 01:01:00 49:01:01 46:58:57 -23:59:59 10:11:12 2001-12-01 01:01:01 1997-12-31 23:59:59
......
...@@ -610,6 +610,19 @@ class Item_typecast :public Item_str_func ...@@ -610,6 +610,19 @@ class Item_typecast :public Item_str_func
}; };
class Item_typecast_maybe_null :public Item_typecast
{
public:
Item_typecast_maybe_null(Item *a) :Item_typecast(a) {}
void fix_length_and_dec()
{
collation.set(&my_charset_bin);
max_length=args[0]->max_length;
maybe_null= 1;
}
};
class Item_char_typecast :public Item_typecast class Item_char_typecast :public Item_typecast
{ {
int cast_length; int cast_length;
...@@ -626,10 +639,10 @@ class Item_char_typecast :public Item_typecast ...@@ -626,10 +639,10 @@ class Item_char_typecast :public Item_typecast
}; };
class Item_date_typecast :public Item_typecast class Item_date_typecast :public Item_typecast_maybe_null
{ {
public: public:
Item_date_typecast(Item *a) :Item_typecast(a) {} Item_date_typecast(Item *a) :Item_typecast_maybe_null(a) {}
String *val_str(String *str); String *val_str(String *str);
bool get_date(TIME *ltime, uint fuzzy_date); bool get_date(TIME *ltime, uint fuzzy_date);
const char *cast_type() const { return "date"; } const char *cast_type() const { return "date"; }
...@@ -641,10 +654,10 @@ class Item_date_typecast :public Item_typecast ...@@ -641,10 +654,10 @@ class Item_date_typecast :public Item_typecast
}; };
class Item_time_typecast :public Item_typecast class Item_time_typecast :public Item_typecast_maybe_null
{ {
public: public:
Item_time_typecast(Item *a) :Item_typecast(a) {} Item_time_typecast(Item *a) :Item_typecast_maybe_null(a) {}
String *val_str(String *str); String *val_str(String *str);
bool get_time(TIME *ltime); bool get_time(TIME *ltime);
const char *cast_type() const { return "time"; } const char *cast_type() const { return "time"; }
...@@ -656,10 +669,10 @@ class Item_time_typecast :public Item_typecast ...@@ -656,10 +669,10 @@ class Item_time_typecast :public Item_typecast
}; };
class Item_datetime_typecast :public Item_typecast class Item_datetime_typecast :public Item_typecast_maybe_null
{ {
public: public:
Item_datetime_typecast(Item *a) :Item_typecast(a) {} Item_datetime_typecast(Item *a) :Item_typecast_maybe_null(a) {}
String *val_str(String *str); String *val_str(String *str);
const char *cast_type() const { return "datetime"; } const char *cast_type() const { return "datetime"; }
enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; } enum_field_types field_type() const { return MYSQL_TYPE_DATETIME; }
......
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