Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
62b0b8b8
Commit
62b0b8b8
authored
Oct 20, 2003
by
gluh@gluh.mysql.r18.ru
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Scrum task 835 - text-to-datetime conversion function
parent
f434b329
Changes
21
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
1650 additions
and
495 deletions
+1650
-495
mysql-test/r/date_formats.result
mysql-test/r/date_formats.result
+157
-0
mysql-test/t/date_formats-master.opt
mysql-test/t/date_formats-master.opt
+1
-0
mysql-test/t/date_formats.test
mysql-test/t/date_formats.test
+82
-0
sql/field.cc
sql/field.cc
+44
-29
sql/item.cc
sql/item.cc
+17
-17
sql/item.h
sql/item.h
+9
-1
sql/item_create.cc
sql/item_create.cc
+5
-0
sql/item_create.h
sql/item_create.h
+1
-0
sql/item_timefunc.cc
sql/item_timefunc.cc
+752
-371
sql/item_timefunc.h
sql/item_timefunc.h
+43
-0
sql/lex.h
sql/lex.h
+2
-0
sql/mysql_priv.h
sql/mysql_priv.h
+22
-5
sql/mysqld.cc
sql/mysqld.cc
+67
-1
sql/protocol.cc
sql/protocol.cc
+19
-26
sql/set_var.cc
sql/set_var.cc
+72
-0
sql/set_var.h
sql/set_var.h
+50
-0
sql/sql_class.cc
sql/sql_class.cc
+3
-0
sql/sql_class.h
sql/sql_class.h
+1
-0
sql/sql_yacc.yy
sql/sql_yacc.yy
+11
-0
sql/structs.h
sql/structs.h
+7
-2
sql/time.cc
sql/time.cc
+285
-43
No files found.
mysql-test/r/date_formats.result
0 → 100644
View file @
62b0b8b8
SHOW GLOBAL VARIABLES LIKE "%_format%";
Variable_name Value
date_format %d.%m.%Y
datetime_format %Y/%d/%m-%H:%i:%s
default_week_format 0
time_format %H.%i.%s
SHOW SESSION VARIABLES LIKE "%_format%";
Variable_name Value
date_format %d.%m.%Y
datetime_format %Y/%d/%m-%H:%i:%s
default_week_format 0
time_format %H.%i.%s
SET date_format="%d.%m.%Y";
select CAST("01.01.2001" as DATE) as a;
a
01.01.2001
SET datetime_format="%d.%m.%Y %H.%i.%s";
select CAST("01.01.2001 05.12.06" as DATETIME) as a;
a
01.01.2001 05.12.06
SET time_format="%H.%i.%s";
select CAST("05.12.06" as TIME) as a;
a
05.12.06
SET datetime_format="%d.%m.%Y %h:%i:%s %p";
select CAST("01.01.2001 05:12:06AM" as DATETIME) as a;
a
01.01.2001 05:12:06 AM
select CAST("01.01.2001 05:12:06 PM" as DATETIME) as a;
a
01.01.2001 05:12:06 PM
SET time_format="%h:%i:%s %p";
select CAST("05:12:06 AM" as TIME) as a;
a
05:12:06 AM
select CAST("05:12:06.1234PM" as TIME) as a;
a
05:12:06.001234 PM
SET time_format="%h.%i.%s %p";
SET date_format='%d.%m.%y';
SET datetime_format="%d.%m.%y %h.%i.%s %p";
select CAST("12-12-06" as DATE) as a;
a
12.12.06
select adddate("01.01.97 11.59.59.000001 PM", 10);
adddate("01.01.97 11.59.59.000001 PM", 10)
11.01.97 11.59.59.000001 PM
select datediff("31.12.97 11.59:59.000001 PM","01.01.98");
datediff("31.12.97 11.59:59.000001 PM","01.01.98")
-1
select weekofyear("31.11.97 11:59:59.000001 PM");
weekofyear("31.11.97 11:59:59.000001 PM")
49
select makedate(1997,1);
makedate(1997,1)
01.01.97
select addtime("31.12.97 11.59.59.999999 PM", "1 1.1.1.000002");
addtime("31.12.97 11.59.59.999999 PM", "1 1.1.1.000002")
02.01.98 01.01.01.000001 AM
select maketime(23,11,12);
maketime(23,11,12)
11.11.12 PM
select timediff("01.01.97 11:59:59.000001 PM","31.12.95 11:59:59.000002 PM");
timediff("01.01.97 11:59:59.000001 PM","31.12.95 11:59:59.000002 PM")
8795.59.59.999999 PM
SET time_format="%H%i%s";
SET time_format="%h%i%s";
ERROR HY000: Unknown error
SET date_format='%d.%m.%d';
ERROR HY000: Unknown error
SET datetime_format="%d.%m.%y %h.%i.%s";
ERROR HY000: Unknown error
SET GLOBAL date_format=default;
SHOW GLOBAL VARIABLES LIKE "date_format%";
Variable_name Value
date_format %d.%m.%Y
SET GLOBAL time_format=default;
SHOW GLOBAL VARIABLES LIKE "time_format%";
Variable_name Value
time_format %H.%i.%s
SET GLOBAL datetime_format=default;
SHOW GLOBAL VARIABLES LIKE "datetime_format%";
Variable_name Value
datetime_format %Y/%d/%m-%H:%i:%s
SET date_format=default;
SHOW SESSION VARIABLES LIKE "date_format%";
Variable_name Value
date_format %d.%m.%Y
SET time_format=default;
SHOW SESSION VARIABLES LIKE "time_format%";
Variable_name Value
time_format %H.%i.%s
SET datetime_format=default;
SHOW SESSION VARIABLES LIKE "datetime_format%";
Variable_name Value
datetime_format %Y/%d/%m-%H:%i:%s
SET time_format='%i:%s:%H';
select cast(str_to_date("15-01-2001 12:59:59", "%d-%m-%Y %H:%i:%S") as TIME);
cast(str_to_date("15-01-2001 12:59:59", "%d-%m-%Y %H:%i:%S") as TIME)
59:59:12
SET GLOBAL date_format='%Y-%m-%d';
SET GLOBAL time_format='%H:%i:%s';
SET GLOBAL datetime_format='%Y-%m-%d %H:%i:%s';
SET date_format='%Y-%m-%d';
SET time_format='%H:%i:%s';
SET datetime_format='%Y-%m-%d %H:%i:%s';
select str_to_date("15-01-2001 12:59:59", "%d-%m-%Y %H:%i:%S");
str_to_date("15-01-2001 12:59:59", "%d-%m-%Y %H:%i:%S")
2001-01-15 12:59:59
select str_to_date("15 September 2001", "%d %M %Y");
str_to_date("15 September 2001", "%d %M %Y")
2001-09-15 00:00:00
select str_to_date("15 Septembeb 2001", "%d %M %Y");
str_to_date("15 Septembeb 2001", "%d %M %Y")
NULL
select str_to_date("15 MAY 2001", "%d %b %Y");
str_to_date("15 MAY 2001", "%d %b %Y")
2001-05-15 00:00:00
select str_to_date("Sunday 15 MAY 2001", "%W %d %b %Y");
str_to_date("Sunday 15 MAY 2001", "%W %d %b %Y")
2001-05-15 00:00:00
select str_to_date("Sundai 15 MAY 2001", "%W %d %b %Y");
str_to_date("Sundai 15 MAY 2001", "%W %d %b %Y")
NULL
select str_to_date("Sundai 15 MA", "%W %d %b %Y");
str_to_date("Sundai 15 MA", "%W %d %b %Y")
NULL
select str_to_date("Tuesday 52 2001", "%W %V %X");
str_to_date("Tuesday 52 2001", "%W %V %X")
NULL
select str_to_date("Sunday 01 2001", "%W %V %X");
str_to_date("Sunday 01 2001", "%W %V %X")
NULL
select str_to_date("Tuesday 00 2002", "%W %U %Y");
str_to_date("Tuesday 00 2002", "%W %U %Y")
2002-01-01 00:00:00
select str_to_date("Thursday 53 1998", "%W %u %Y");
str_to_date("Thursday 53 1998", "%W %u %Y")
1998-12-31 00:00:00
select str_to_date("15-01-2001", "%d-%m-%Y %H:%i:%S");
str_to_date("15-01-2001", "%d-%m-%Y %H:%i:%S")
2001-01-15 00:00:00
select str_to_date("15-01-20", "%d-%m-%Y");
str_to_date("15-01-20", "%d-%m-%Y")
NULL
select str_to_date("15-2001-1", "%d-%Y-%c");
str_to_date("15-2001-1", "%d-%Y-%c")
2001-01-15 00:00:00
select get_format(DATE, 'USA') as a;
a
%m.%d.%Y
select get_format(TIME, 'internal') as a;
a
%H%i%s
select get_format(DATETIME, 'eur') as a;
a
%Y-%m-%d-%H.%i.%s
mysql-test/t/date_formats-master.opt
0 → 100644
View file @
62b0b8b8
--date_format=%d.%m.%Y --time_format=%H.%i.%s --datetime_format=%Y/%d/%m-%H:%i:%s
mysql-test/t/date_formats.test
0 → 100644
View file @
62b0b8b8
SHOW
GLOBAL
VARIABLES
LIKE
"%_format%"
;
SHOW
SESSION
VARIABLES
LIKE
"%_format%"
;
SET
date_format
=
"%d.%m.%Y"
;
select
CAST
(
"01.01.2001"
as
DATE
)
as
a
;
SET
datetime_format
=
"%d.%m.%Y %H.%i.%s"
;
select
CAST
(
"01.01.2001 05.12.06"
as
DATETIME
)
as
a
;
SET
time_format
=
"%H.%i.%s"
;
select
CAST
(
"05.12.06"
as
TIME
)
as
a
;
SET
datetime_format
=
"%d.%m.%Y %h:%i:%s %p"
;
select
CAST
(
"01.01.2001 05:12:06AM"
as
DATETIME
)
as
a
;
select
CAST
(
"01.01.2001 05:12:06 PM"
as
DATETIME
)
as
a
;
SET
time_format
=
"%h:%i:%s %p"
;
select
CAST
(
"05:12:06 AM"
as
TIME
)
as
a
;
select
CAST
(
"05:12:06.1234PM"
as
TIME
)
as
a
;
SET
time_format
=
"%h.%i.%s %p"
;
SET
date_format
=
'%d.%m.%y'
;
SET
datetime_format
=
"%d.%m.%y %h.%i.%s %p"
;
select
CAST
(
"12-12-06"
as
DATE
)
as
a
;
select
adddate
(
"01.01.97 11.59.59.000001 PM"
,
10
);
select
datediff
(
"31.12.97 11.59:59.000001 PM"
,
"01.01.98"
);
select
weekofyear
(
"31.11.97 11:59:59.000001 PM"
);
select
makedate
(
1997
,
1
);
select
addtime
(
"31.12.97 11.59.59.999999 PM"
,
"1 1.1.1.000002"
);
select
maketime
(
23
,
11
,
12
);
select
timediff
(
"01.01.97 11:59:59.000001 PM"
,
"31.12.95 11:59:59.000002 PM"
);
SET
time_format
=
"%H%i%s"
;
--
error
1105
SET
time_format
=
"%h%i%s"
;
--
error
1105
SET
date_format
=
'%d.%m.%d'
;
--
error
1105
SET
datetime_format
=
"%d.%m.%y %h.%i.%s"
;
SET
GLOBAL
date_format
=
default
;
SHOW
GLOBAL
VARIABLES
LIKE
"date_format%"
;
SET
GLOBAL
time_format
=
default
;
SHOW
GLOBAL
VARIABLES
LIKE
"time_format%"
;
SET
GLOBAL
datetime_format
=
default
;
SHOW
GLOBAL
VARIABLES
LIKE
"datetime_format%"
;
SET
date_format
=
default
;
SHOW
SESSION
VARIABLES
LIKE
"date_format%"
;
SET
time_format
=
default
;
SHOW
SESSION
VARIABLES
LIKE
"time_format%"
;
SET
datetime_format
=
default
;
SHOW
SESSION
VARIABLES
LIKE
"datetime_format%"
;
SET
time_format
=
'%i:%s:%H'
;
select
cast
(
str_to_date
(
"15-01-2001 12:59:59"
,
"%d-%m-%Y %H:%i:%S"
)
as
TIME
);
SET
GLOBAL
date_format
=
'%Y-%m-%d'
;
SET
GLOBAL
time_format
=
'%H:%i:%s'
;
SET
GLOBAL
datetime_format
=
'%Y-%m-%d %H:%i:%s'
;
SET
date_format
=
'%Y-%m-%d'
;
SET
time_format
=
'%H:%i:%s'
;
SET
datetime_format
=
'%Y-%m-%d %H:%i:%s'
;
select
str_to_date
(
"15-01-2001 12:59:59"
,
"%d-%m-%Y %H:%i:%S"
);
select
str_to_date
(
"15 September 2001"
,
"%d %M %Y"
);
select
str_to_date
(
"15 Septembeb 2001"
,
"%d %M %Y"
);
select
str_to_date
(
"15 MAY 2001"
,
"%d %b %Y"
);
select
str_to_date
(
"Sunday 15 MAY 2001"
,
"%W %d %b %Y"
);
select
str_to_date
(
"Sundai 15 MAY 2001"
,
"%W %d %b %Y"
);
select
str_to_date
(
"Sundai 15 MA"
,
"%W %d %b %Y"
);
select
str_to_date
(
"Tuesday 52 2001"
,
"%W %V %X"
);
select
str_to_date
(
"Sunday 01 2001"
,
"%W %V %X"
);
select
str_to_date
(
"Tuesday 00 2002"
,
"%W %U %Y"
);
select
str_to_date
(
"Thursday 53 1998"
,
"%W %u %Y"
);
select
str_to_date
(
"15-01-2001"
,
"%d-%m-%Y %H:%i:%S"
);
select
str_to_date
(
"15-01-20"
,
"%d-%m-%Y"
);
select
str_to_date
(
"15-2001-1"
,
"%d-%Y-%c"
);
select
get_format
(
DATE
,
'USA'
)
as
a
;
select
get_format
(
TIME
,
'internal'
)
as
a
;
select
get_format
(
DATETIME
,
'eur'
)
as
a
;
sql/field.cc
View file @
62b0b8b8
...
...
@@ -279,7 +279,8 @@ bool Field::get_date(TIME *ltime,bool fuzzydate)
char
buff
[
40
];
String
tmp
(
buff
,
sizeof
(
buff
),
&
my_charset_bin
),
tmp2
,
*
res
;
if
(
!
(
res
=
val_str
(
&
tmp
,
&
tmp2
))
||
str_to_TIME
(
res
->
ptr
(),
res
->
length
(),
ltime
,
fuzzydate
)
==
TIMESTAMP_NONE
)
str_to_TIME
(
res
->
ptr
(),
res
->
length
(),
ltime
,
fuzzydate
,
current_thd
)
<=
WRONG_TIMESTAMP_FULL
)
return
1
;
return
0
;
}
...
...
@@ -289,7 +290,7 @@ bool Field::get_time(TIME *ltime)
char
buff
[
40
];
String
tmp
(
buff
,
sizeof
(
buff
),
&
my_charset_bin
),
tmp2
,
*
res
;
if
(
!
(
res
=
val_str
(
&
tmp
,
&
tmp2
))
||
str_to_time
(
res
->
ptr
(),
res
->
length
(),
ltime
))
str_to_time
(
res
->
ptr
(),
res
->
length
(),
ltime
,
current_thd
))
return
1
;
return
0
;
}
...
...
@@ -299,28 +300,29 @@ bool Field::get_time(TIME *ltime)
void
Field
::
store_time
(
TIME
*
ltime
,
timestamp_type
type
)
{
char
buff
[
25
];
String
tmp
((
char
*
)
buff
,
sizeof
(
buff
),
&
my_charset_bin
);
DATETIME_FORMAT
*
tmp_format
=
0
;
bool
is_time_only
=
0
;
switch
(
type
)
{
case
TIMESTAMP_NONE
:
case
WRONG_TIMESTAMP_FULL
:
store
(
""
,
0
,
&
my_charset_bin
);
// Probably an error
break
;
return
;
case
TIMESTAMP_DATE
:
sprintf
(
buff
,
"%04d-%02d-%02d"
,
ltime
->
year
,
ltime
->
month
,
ltime
->
day
);
store
(
buff
,
10
,
&
my_charset_bin
);
tmp_format
=
&
t_datetime_frm
(
current_thd
,
DATE_FORMAT_TYPE
).
datetime_format
;
break
;
case
TIMESTAMP_FULL
:
sprintf
(
buff
,
"%04d-%02d-%02d %02d:%02d:%02d"
,
ltime
->
year
,
ltime
->
month
,
ltime
->
day
,
ltime
->
hour
,
ltime
->
minute
,
ltime
->
second
);
store
(
buff
,
19
,
&
my_charset_bin
);
tmp_format
=&
t_datetime_frm
(
current_thd
,
DATETIME_FORMAT_TYPE
).
datetime_format
;
break
;
case
TIMESTAMP_TIME
:
{
ulong
length
=
my_sprintf
(
buff
,
(
buff
,
"%02d:%02d:%02d"
,
ltime
->
hour
,
ltime
->
minute
,
ltime
->
second
));
store
(
buff
,(
uint
)
length
,
&
my_charset_bin
);
tmp_format
=
&
t_datetime_frm
(
current_thd
,
TIME_FORMAT_TYPE
).
datetime_format
;
is_time_only
=
1
;
break
;
}
}
make_datetime
(
&
tmp
,
ltime
,
is_time_only
,
0
,
tmp_format
->
format
,
tmp_format
->
format_length
,
1
);
store
(
tmp
.
ptr
(),
tmp
.
length
(),
&
my_charset_bin
);
}
...
...
@@ -2684,7 +2686,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg,
int
Field_timestamp
::
store
(
const
char
*
from
,
uint
len
,
CHARSET_INFO
*
cs
)
{
long
tmp
=
(
long
)
str_to_timestamp
(
from
,
len
);
long
tmp
=
(
long
)
str_to_timestamp
(
from
,
len
,
current_thd
);
#ifdef WORDS_BIGENDIAN
if
(
table
->
db_low_byte_first
)
{
...
...
@@ -3018,7 +3020,7 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
TIME
ltime
;
long
tmp
;
int
error
=
0
;
if
(
str_to_time
(
from
,
len
,
&
ltime
))
if
(
str_to_time
(
from
,
len
,
&
ltime
,
current_thd
))
{
tmp
=
0L
;
error
=
1
;
...
...
@@ -3127,19 +3129,25 @@ longlong Field_time::val_int(void)
String
*
Field_time
::
val_str
(
String
*
val_buffer
,
String
*
val_ptr
__attribute__
((
unused
)))
{
TIME
ltime
;
val_buffer
->
alloc
(
16
);
long
tmp
=
(
long
)
sint3korr
(
ptr
);
const
char
*
sign
=
""
;
ltime
.
neg
=
0
;
if
(
tmp
<
0
)
{
tmp
=
-
tmp
;
sign
=
"-"
;
}
long
length
=
my_sprintf
((
char
*
)
val_buffer
->
ptr
(),
((
char
*
)
val_buffer
->
ptr
(),
"%s%02d:%02d:%02d"
,
sign
,(
int
)
(
tmp
/
10000
),
(
int
)
(
tmp
/
100
%
100
),
(
int
)
(
tmp
%
100
)));
val_buffer
->
length
(
length
);
ltime
.
neg
=
1
;
}
DATETIME_FORMAT
*
tmp_format
=
(
&
t_datetime_frm
(
current_thd
,
TIME_FORMAT_TYPE
).
datetime_format
);
ltime
.
day
=
(
uint
)
0
;
ltime
.
hour
=
(
uint
)
(
tmp
/
10000
);
ltime
.
minute
=
(
uint
)
(
tmp
/
100
%
100
);
ltime
.
second
=
(
uint
)
(
tmp
%
100
);
make_datetime
(
val_buffer
,
&
ltime
,
0
,
0
,
tmp_format
->
format
,
tmp_format
->
format_length
,
1
);
return
val_buffer
;
}
...
...
@@ -3305,7 +3313,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
TIME
l_time
;
uint32
tmp
;
int
error
=
0
;
if
(
str_to_TIME
(
from
,
len
,
&
l_time
,
1
)
==
TIMESTAMP_NONE
)
if
(
str_to_TIME
(
from
,
len
,
&
l_time
,
1
,
current_thd
)
<=
WRONG_TIMESTAMP_FULL
)
{
tmp
=
0
;
error
=
1
;
...
...
@@ -3415,6 +3423,7 @@ longlong Field_date::val_int(void)
String
*
Field_date
::
val_str
(
String
*
val_buffer
,
String
*
val_ptr
__attribute__
((
unused
)))
{
TIME
ltime
;
val_buffer
->
alloc
(
field_length
);
val_buffer
->
length
(
field_length
);
int32
tmp
;
...
...
@@ -3424,9 +3433,15 @@ String *Field_date::val_str(String *val_buffer,
else
#endif
longget
(
tmp
,
ptr
);
sprintf
((
char
*
)
val_buffer
->
ptr
(),
"%04d-%02d-%02d"
,
(
int
)
((
uint32
)
tmp
/
10000L
%
10000
),
(
int
)
((
uint32
)
tmp
/
100
%
100
),
(
int
)
((
uint32
)
tmp
%
100
));
DATETIME_FORMAT
*
tmp_format
=
(
&
t_datetime_frm
(
current_thd
,
DATE_FORMAT_TYPE
).
datetime_format
);
ltime
.
neg
=
0
;
ltime
.
year
=
(
int
)
((
uint32
)
tmp
/
10000L
%
10000
);
ltime
.
month
=
(
int
)
((
uint32
)
tmp
/
100
%
100
);
ltime
.
day
=
(
int
)
((
uint32
)
tmp
%
100
);
make_datetime
(
val_buffer
,
&
ltime
,
0
,
0
,
tmp_format
->
format
,
tmp_format
->
format_length
,
1
);
return
val_buffer
;
}
...
...
@@ -3485,7 +3500,7 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
TIME
l_time
;
long
tmp
;
int
error
=
0
;
if
(
str_to_TIME
(
from
,
len
,
&
l_time
,
1
)
==
TIMESTAMP_NONE
)
if
(
str_to_TIME
(
from
,
len
,
&
l_time
,
1
,
current_thd
)
<=
WRONG_TIMESTAMP_FULL
)
{
tmp
=
0L
;
error
=
1
;
...
...
@@ -3654,7 +3669,7 @@ void Field_newdate::sql_type(String &res) const
int
Field_datetime
::
store
(
const
char
*
from
,
uint
len
,
CHARSET_INFO
*
cs
)
{
longlong
tmp
=
str_to_datetime
(
from
,
len
,
1
);
longlong
tmp
=
str_to_datetime
(
from
,
len
,
1
,
current_thd
);
#ifdef WORDS_BIGENDIAN
if
(
table
->
db_low_byte_first
)
{
...
...
sql/item.cc
View file @
62b0b8b8
...
...
@@ -46,7 +46,7 @@ Item::Item():
collation
.
set
(
default_charset
(),
DERIVATION_COERCIBLE
);
name
=
0
;
decimals
=
0
;
max_length
=
0
;
THD
*
thd
=
current_thd
;
thd
=
current_thd
;
next
=
thd
->
free_list
;
// Put in free list
thd
->
free_list
=
this
;
/*
...
...
@@ -69,7 +69,7 @@ Item::Item():
Used for duplicating lists in processing queries with temporary
tables
*/
Item
::
Item
(
THD
*
thd
,
Item
&
item
)
:
Item
::
Item
(
THD
*
c_
thd
,
Item
&
item
)
:
str_value
(
item
.
str_value
),
name
(
item
.
name
),
max_length
(
item
.
max_length
),
...
...
@@ -82,7 +82,8 @@ Item::Item(THD *thd, Item &item):
fixed
(
item
.
fixed
),
collation
(
item
.
collation
)
{
next
=
thd
->
free_list
;
// Put in free list
next
=
c_thd
->
free_list
;
// Put in free list
thd
=
c_thd
;
thd
->
free_list
=
this
;
}
...
...
@@ -174,7 +175,8 @@ bool Item::get_date(TIME *ltime,bool fuzzydate)
char
buff
[
40
];
String
tmp
(
buff
,
sizeof
(
buff
),
&
my_charset_bin
),
*
res
;
if
(
!
(
res
=
val_str
(
&
tmp
))
||
str_to_TIME
(
res
->
ptr
(),
res
->
length
(),
ltime
,
fuzzydate
)
==
TIMESTAMP_NONE
)
str_to_TIME
(
res
->
ptr
(),
res
->
length
(),
ltime
,
fuzzydate
,
thd
)
<=
WRONG_TIMESTAMP_FULL
)
{
bzero
((
char
*
)
ltime
,
sizeof
(
*
ltime
));
return
1
;
...
...
@@ -192,7 +194,7 @@ bool Item::get_time(TIME *ltime)
char
buff
[
40
];
String
tmp
(
buff
,
sizeof
(
buff
),
&
my_charset_bin
),
*
res
;
if
(
!
(
res
=
val_str
(
&
tmp
))
||
str_to_time
(
res
->
ptr
(),
res
->
length
(),
ltime
))
str_to_time
(
res
->
ptr
(),
res
->
length
(),
ltime
,
thd
))
{
bzero
((
char
*
)
ltime
,
sizeof
(
*
ltime
));
return
1
;
...
...
@@ -673,30 +675,28 @@ String *Item_param::query_val_str(String* str)
}
else
{
char
buff
[
25
];
DATETIME_FORMAT
*
tmp_format
=
0
;
bool
is_time_only
=
0
;
switch
(
ltime
.
time_type
)
{
case
TIMESTAMP_NONE
:
case
WRONG_TIMESTAMP_FULL
:
break
;
case
TIMESTAMP_DATE
:
sprintf
(
buff
,
"%04d-%02d-%02d"
,
ltime
.
year
,
ltime
.
month
,
ltime
.
day
);
str
->
append
(
buff
,
10
);
tmp_format
=
&
t_datetime_frm
(
thd
,
DATE_FORMAT_TYPE
).
datetime_format
;
break
;
case
TIMESTAMP_FULL
:
sprintf
(
buff
,
"%04d-%02d-%02d %02d:%02d:%02d"
,
ltime
.
year
,
ltime
.
month
,
ltime
.
day
,
ltime
.
hour
,
ltime
.
minute
,
ltime
.
second
);
str
->
append
(
buff
,
19
);
tmp_format
=
&
t_datetime_frm
(
thd
,
DATETIME_FORMAT_TYPE
).
datetime_format
;
break
;
case
TIMESTAMP_TIME
:
{
sprintf
(
buff
,
"%02d:%02d:%02d"
,
ltime
.
hour
,
ltime
.
minute
,
ltime
.
second
);
str
->
append
(
buff
,
8
);
tmp_format
=
&
t_datetime_frm
(
thd
,
TIME_FORMAT_TYPE
).
datetime_format
;
is_time_only
=
1
;
break
;
}
}
}
make_datetime
(
str
,
&
ltime
,
is_time_only
,
0
,
tmp_format
->
format
,
tmp_format
->
format_length
,
0
);
}
str
->
append
(
"'"
);
}
...
...
sql/item.h
View file @
62b0b8b8
...
...
@@ -113,6 +113,14 @@ class Item {
my_bool
with_sum_func
;
my_bool
fixed
;
/* If item fixed with fix_fields */
DTCollation
collation
;
/*
thd is current_thd value. Like some other Item's fields it
will be a problem for using one Item in different threads
(as stored procedures may want to do in the future)
*/
THD
*
thd
;
// alloc & destruct is done as start of select using sql_alloc
Item
();
...
...
@@ -124,7 +132,7 @@ class Item {
top AND/OR ctructure of WHERE clause to protect it of
optimisation changes in prepared statements
*/
Item
(
THD
*
thd
,
Item
&
item
);
Item
(
THD
*
c_
thd
,
Item
&
item
);
virtual
~
Item
()
{
name
=
0
;
}
/*lint -e1509 */
void
set_name
(
const
char
*
str
,
uint
length
,
CHARSET_INFO
*
cs
);
void
init_make_field
(
Send_field
*
tmp_field
,
enum
enum_field_types
type
);
...
...
sql/item_create.cc
View file @
62b0b8b8
...
...
@@ -701,3 +701,8 @@ Item *create_func_maketime(Item* a,Item* b,Item* c)
{
return
new
Item_func_maketime
(
a
,
b
,
c
);
}
Item
*
create_func_str_to_date
(
Item
*
a
,
Item
*
b
)
{
return
new
Item_func_str_to_date
(
a
,
b
);
}
sql/item_create.h
View file @
62b0b8b8
...
...
@@ -149,3 +149,4 @@ Item *create_func_addtime(Item* a,Item* b);
Item
*
create_func_subtime
(
Item
*
a
,
Item
*
b
);
Item
*
create_func_timediff
(
Item
*
a
,
Item
*
b
);
Item
*
create_func_maketime
(
Item
*
a
,
Item
*
b
,
Item
*
c
);
Item
*
create_func_str_to_date
(
Item
*
a
,
Item
*
b
);
sql/item_timefunc.cc
View file @
62b0b8b8
This diff is collapsed.
Click to expand it.
sql/item_timefunc.h
View file @
62b0b8b8
...
...
@@ -763,3 +763,46 @@ class Item_func_microsecond :public Item_int_func
maybe_null
=
1
;
}
};
enum
datetime_format
{
USA_FORMAT
,
JIS_FORMAT
,
ISO_FORMAT
,
EUR_FORMAT
,
INTERNAL_FORMAT
};
enum
datetime_format_types
{
DATE_FORMAT_TYPE
=
0
,
TIME_FORMAT_TYPE
,
DATETIME_FORMAT_TYPE
};
class
Item_func_get_format
:
public
Item_str_func
{
const
datetime_format_types
tm_format
;
public:
Item_func_get_format
(
datetime_format_types
type_arg1
,
Item
*
a
)
:
Item_str_func
(
a
),
tm_format
(
type_arg1
)
{}
String
*
val_str
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"get_format"
;
}
void
fix_length_and_dec
()
{
decimals
=
0
;
max_length
=
17
*
MY_CHARSET_BIN_MB_MAXLEN
;
}
};
class
Item_func_str_to_date
:
public
Item_str_func
{
public:
Item_func_str_to_date
(
Item
*
a
,
Item
*
b
)
:
Item_str_func
(
a
,
b
)
{}
String
*
val_str
(
String
*
str
);
const
char
*
func_name
()
const
{
return
"str_to_date"
;
}
void
fix_length_and_dec
()
{
decimals
=
0
;
max_length
=
29
*
MY_CHARSET_BIN_MB_MAXLEN
;
}
};
sql/lex.h
View file @
62b0b8b8
...
...
@@ -176,6 +176,7 @@ static SYMBOL symbols[] = {
{
"FUNCTION"
,
SYM
(
UDF_SYM
),
0
,
0
},
{
"GEOMETRY"
,
SYM
(
GEOMETRY_SYM
),
0
,
0
},
{
"GEOMETRYCOLLECTION"
,
SYM
(
GEOMETRYCOLLECTION
),
0
,
0
},
{
"GET_FORMAT"
,
SYM
(
GET_FORMAT
),
0
,
0
},
{
"GLOBAL"
,
SYM
(
GLOBAL_SYM
),
0
,
0
},
{
"GRANT"
,
SYM
(
GRANT
),
0
,
0
},
{
"GRANTS"
,
SYM
(
GRANTS
),
0
,
0
},
...
...
@@ -634,6 +635,7 @@ static SYMBOL sql_functions[] = {
{
"STARTPOINT"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_startpoint
)},
{
"STD"
,
SYM
(
STD_SYM
),
0
,
0
},
{
"STDDEV"
,
SYM
(
STD_SYM
),
0
,
0
},
{
"STR_TO_DATE"
,
SYM
(
FUNC_ARG2
),
0
,
CREATE_FUNC
(
create_func_str_to_date
)},
{
"STRCMP"
,
SYM
(
FUNC_ARG2
),
0
,
CREATE_FUNC
(
create_func_strcmp
)},
{
"SUBSTR"
,
SYM
(
SUBSTRING
),
0
,
0
},
{
"SUBSTRING"
,
SYM
(
SUBSTRING
),
0
,
0
},
...
...
sql/mysql_priv.h
View file @
62b0b8b8
...
...
@@ -783,7 +783,7 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open,
LOCK_delayed_status
,
LOCK_delayed_create
,
LOCK_crypt
,
LOCK_timezone
,
LOCK_slave_list
,
LOCK_active_mi
,
LOCK_manager
,
LOCK_global_system_variables
;
extern
rw_lock_t
LOCK_grant
;
extern
rw_lock_t
LOCK_grant
;
extern
pthread_cond_t
COND_refresh
,
COND_thread_count
,
COND_manager
;
extern
pthread_attr_t
connection_attrib
;
extern
I_List
<
THD
>
threads
;
...
...
@@ -800,6 +800,13 @@ extern struct system_variables global_system_variables;
extern
struct
system_variables
max_system_variables
;
extern
struct
rand_struct
sql_rand
;
#define g_datetime_frm(a) (global_system_variables.datetime_formats[(a)])
#define t_datetime_frm(a, b) ((a)->variables.datetime_formats[(b)])
extern
const
char
*
datetime_formats
[
4
][
5
];
extern
const
char
*
opt_datetime_format_names
[
3
];
extern
const
char
*
opt_datetime_formats
[
3
];
/* optional things, have_* variables */
extern
SHOW_COMP_OPTION
have_isam
,
have_innodb
,
have_berkeley_db
;
...
...
@@ -863,14 +870,24 @@ void get_date_from_daynr(long daynr,uint *year, uint *month,
uint
*
day
);
void
init_time
(
void
);
long
my_gmt_sec
(
TIME
*
,
long
*
current_timezone
);
time_t
str_to_timestamp
(
const
char
*
str
,
uint
length
);
bool
str_to_time
(
const
char
*
str
,
uint
length
,
TIME
*
l_time
);
longlong
str_to_datetime
(
const
char
*
str
,
uint
length
,
bool
fuzzy_date
);
time_t
str_to_timestamp
(
const
char
*
str
,
uint
length
,
THD
*
thd
);
bool
str_to_time
(
const
char
*
str
,
uint
length
,
TIME
*
l_time
,
THD
*
thd
);
longlong
str_to_datetime
(
const
char
*
str
,
uint
length
,
bool
fuzzy_date
,
THD
*
thd
);
timestamp_type
str_to_TIME
(
const
char
*
str
,
uint
length
,
TIME
*
l_time
,
bool
fuzzy_date
);
bool
fuzzy_date
,
THD
*
thd
);
void
localtime_to_TIME
(
TIME
*
to
,
struct
tm
*
from
);
void
calc_time_from_sec
(
TIME
*
to
,
long
seconds
,
long
microseconds
);
extern
DATETIME_FORMAT
*
make_format
(
DATETIME_FORMAT
*
datetime_format
,
datetime_format_types
format_type
,
const
char
*
format_str
,
uint
format_length
,
bool
is_alloc
);
extern
String
*
make_datetime
(
String
*
str
,
TIME
*
l_time
,
const
bool
is_time_only
,
const
bool
add_second_frac
,
const
char
*
ptr
,
uint
format_length
,
bool
set_len_to_zero
);
int
test_if_number
(
char
*
str
,
int
*
res
,
bool
allow_wildcards
);
void
change_byte
(
byte
*
,
uint
,
char
,
char
);
extern
"C"
void
unireg_abort
(
int
exit_code
);
...
...
sql/mysqld.cc
View file @
62b0b8b8
...
...
@@ -310,6 +310,12 @@ char* log_error_file_ptr= log_error_file;
char
mysql_real_data_home
[
FN_REFLEN
],
language
[
LIBLEN
],
reg_ext
[
FN_EXTLEN
],
mysql_charsets_dir
[
FN_REFLEN
],
max_sort_char
,
*
mysqld_user
,
*
mysqld_chroot
,
*
opt_init_file
;
const
char
*
opt_datetime_formats
[
3
];
const
char
*
opt_datetime_format_names
[
3
]
=
{
"date_format"
,
"time_format"
,
"datetime_format"
};
char
*
language_ptr
,
*
default_collation_name
,
*
default_character_set_name
;
char
mysql_data_home_buff
[
2
],
*
mysql_data_home
=
mysql_real_data_home
;
char
server_version
[
SERVER_VERSION_LENGTH
]
=
MYSQL_SERVER_VERSION
;
...
...
@@ -893,6 +899,9 @@ void clean_up(bool print_message)
#ifdef USE_RAID
end_raid
();
#endif
g_datetime_frm
(
DATE_FORMAT_TYPE
).
clean
();
g_datetime_frm
(
TIME_FORMAT_TYPE
).
clean
();
g_datetime_frm
(
DATETIME_FORMAT_TYPE
).
clean
();
if
(
defaults_argv
)
free_defaults
(
defaults_argv
);
free_tmpdir
(
&
mysql_tmpdir_list
);
...
...
@@ -1976,6 +1985,36 @@ bool open_log(MYSQL_LOG *log, const char *hostname,
}
int
init_global_datetime_format
(
datetime_format_types
format_type
,
bool
is_alloc
)
{
const
char
*
format_str
=
opt_datetime_formats
[
format_type
];
uint
format_length
=
0
;
DATETIME_FORMAT
*
tmp_format
=
&
g_datetime_frm
(
format_type
).
datetime_format
;
if
(
format_str
)
{
format_str
=
opt_datetime_formats
[
format_type
];
format_length
=
strlen
(
format_str
);
}
else
{
format_str
=
datetime_formats
[
format_type
][
ISO_FORMAT
];
format_length
=
strlen
(
datetime_formats
[
format_type
][
ISO_FORMAT
]);
opt_datetime_formats
[
format_type
]
=
format_str
;
}
if
(
make_format
(
tmp_format
,
format_type
,
format_str
,
format_length
,
is_alloc
))
{
g_datetime_frm
(
format_type
).
name
=
opt_datetime_format_names
[
format_type
];
g_datetime_frm
(
format_type
).
name_length
=
strlen
(
opt_datetime_format_names
[
format_type
]);
g_datetime_frm
(
format_type
).
format_type
=
format_type
;
return
0
;
}
return
1
;
}
static
int
init_common_variables
(
const
char
*
conf_file_name
,
int
argc
,
char
**
argv
,
const
char
**
groups
)
{
...
...
@@ -2089,6 +2128,11 @@ static int init_common_variables(const char *conf_file_name, int argc,
global_system_variables
.
character_set_client
=
default_charset_info
;
global_system_variables
.
collation_connection
=
default_charset_info
;
if
(
init_global_datetime_format
(
DATE_FORMAT_TYPE
,
1
)
||
init_global_datetime_format
(
TIME_FORMAT_TYPE
,
1
)
||
init_global_datetime_format
(
DATETIME_FORMAT_TYPE
,
1
))
return
1
;
if
(
use_temp_pool
&&
bitmap_init
(
&
temp_pool
,
1024
,
1
))
return
1
;
return
0
;
...
...
@@ -3533,7 +3577,10 @@ enum options
OPT_DEFAULT_WEEK_FORMAT
,
OPT_GROUP_CONCAT_MAX_LEN
,
OPT_DEFAULT_COLLATION
,
OPT_SECURE_AUTH
OPT_SECURE_AUTH
,
OPT_DATE_FORMAT
,
OPT_TIME_FORMAT
,
OPT_DATETIME_FORMAT
};
...
...
@@ -4444,6 +4491,21 @@ The minimum value for this variable is 4096.",
(
gptr
*
)
&
global_system_variables
.
default_week_format
,
(
gptr
*
)
&
max_system_variables
.
default_week_format
,
0
,
GET_ULONG
,
REQUIRED_ARG
,
0
,
0
,
3L
,
0
,
1
,
0
},
{
"date-format"
,
OPT_DATE_FORMAT
,
"The DATE format."
,
(
gptr
*
)
&
opt_datetime_formats
[
DATE_FORMAT_TYPE
],
(
gptr
*
)
&
opt_datetime_formats
[
DATE_FORMAT_TYPE
],
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"datetime-format"
,
OPT_DATETIME_FORMAT
,
"The DATETIME/TIMESTAMP format."
,
(
gptr
*
)
&
opt_datetime_formats
[
DATETIME_FORMAT_TYPE
],
(
gptr
*
)
&
opt_datetime_formats
[
DATETIME_FORMAT_TYPE
],
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"time-format"
,
OPT_TIME_FORMAT
,
"The TIME format."
,
(
gptr
*
)
&
opt_datetime_formats
[
TIME_FORMAT_TYPE
],
(
gptr
*
)
&
opt_datetime_formats
[
TIME_FORMAT_TYPE
],
0
,
GET_STR
,
REQUIRED_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
GET_NO_ARG
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
}
};
...
...
@@ -4821,6 +4883,10 @@ static void mysql_init_variables(void)
max_system_variables
.
max_join_size
=
(
ulonglong
)
HA_POS_ERROR
;
global_system_variables
.
old_passwords
=
0
;
init_global_datetime_format
(
DATE_FORMAT_TYPE
,
0
);
init_global_datetime_format
(
TIME_FORMAT_TYPE
,
0
);
init_global_datetime_format
(
DATETIME_FORMAT_TYPE
,
0
);
/* Variables that depends on compile options */
#ifndef DBUG_OFF
default_dbug_option
=
IF_WIN
(
"d:t:i:O,
\\
mysqld.trace"
,
...
...
sql/protocol.cc
View file @
62b0b8b8
...
...
@@ -831,17 +831,12 @@ bool Protocol_simple::store(TIME *tm)
field_pos
++
;
#endif
char
buff
[
40
];
uint
length
;
length
=
my_sprintf
(
buff
,(
buff
,
"%04d-%02d-%02d %02d:%02d:%02d"
,
(
int
)
tm
->
year
,
(
int
)
tm
->
month
,
(
int
)
tm
->
day
,
(
int
)
tm
->
hour
,
(
int
)
tm
->
minute
,
(
int
)
tm
->
second
));
if
(
tm
->
second_part
)
length
+=
my_sprintf
(
buff
+
length
,(
buff
+
length
,
".%06d"
,
(
int
)
tm
->
second_part
));
return
net_store_data
((
char
*
)
buff
,
length
);
String
tmp
((
char
*
)
buff
,
sizeof
(
buff
),
&
my_charset_bin
);
DATETIME_FORMAT
*
tmp_format
=
(
&
t_datetime_frm
(
current_thd
,
DATETIME_FORMAT_TYPE
).
datetime_format
);
make_datetime
(
&
tmp
,
tm
,
1
,
tm
->
second_part
,
tmp_format
->
format
,
tmp_format
->
format_length
,
1
);
return
net_store_data
((
char
*
)
tmp
.
ptr
(),
tmp
.
length
());
}
...
...
@@ -853,12 +848,12 @@ bool Protocol_simple::store_date(TIME *tm)
field_pos
++
;
#endif
char
buff
[
40
];
uint
length
;
length
=
my_sprintf
(
buff
,(
buff
,
"%04d-%02d-%02d"
,
(
int
)
tm
->
year
,
(
int
)
tm
->
month
,
(
int
)
tm
->
day
)
);
return
net_store_data
((
char
*
)
buff
,
length
);
String
tmp
((
char
*
)
buff
,
sizeof
(
buff
),
&
my_charset_bin
)
;
DATETIME_FORMAT
*
tmp_format
=
(
&
t_datetime_frm
(
current_thd
,
DATE_FORMAT_TYPE
).
datetime_format
);
make_datetime
(
&
tmp
,
tm
,
1
,
0
,
tmp_format
->
format
,
tmp_format
->
format_length
,
1
);
return
net_store_data
((
char
*
)
tmp
.
ptr
(),
tmp
.
length
()
);
}
...
...
@@ -876,16 +871,14 @@ bool Protocol_simple::store_time(TIME *tm)
field_pos
++
;
#endif
char
buff
[
40
];
uint
length
;
String
tmp
((
char
*
)
buff
,
sizeof
(
buff
),
&
my_charset_bin
);
DATETIME_FORMAT
*
tmp_format
=
(
&
t_datetime_frm
(
current_thd
,
TIME_FORMAT_TYPE
).
datetime_format
);
uint
day
=
(
tm
->
year
||
tm
->
month
)
?
0
:
tm
->
day
;
length
=
my_sprintf
(
buff
,(
buff
,
"%s%02ld:%02d:%02d"
,
tm
->
neg
?
"-"
:
""
,
(
long
)
day
*
24L
+
(
long
)
tm
->
hour
,
(
int
)
tm
->
minute
,
(
int
)
tm
->
second
));
if
(
tm
->
second_part
)
length
+=
my_sprintf
(
buff
+
length
,(
buff
+
length
,
".%06d"
,
(
int
)
tm
->
second_part
));
return
net_store_data
((
char
*
)
buff
,
length
);
tm
->
hour
=
(
long
)
day
*
24L
+
(
long
)
tm
->
hour
;
make_datetime
(
&
tmp
,
tm
,
0
,
tm
->
second_part
,
tmp_format
->
format
,
tmp_format
->
format_length
,
1
);
return
net_store_data
((
char
*
)
tmp
.
ptr
(),
tmp
.
length
());
}
...
...
sql/set_var.cc
View file @
62b0b8b8
...
...
@@ -383,6 +383,9 @@ sys_var *sys_variables[]=
&
sys_collation_connection
,
&
sys_concurrent_insert
,
&
sys_connect_timeout
,
&
g_datetime_frm
(
DATE_FORMAT_TYPE
),
&
g_datetime_frm
(
DATETIME_FORMAT_TYPE
),
&
g_datetime_frm
(
TIME_FORMAT_TYPE
),
&
sys_default_week_format
,
&
sys_delay_key_write
,
&
sys_delayed_insert_limit
,
...
...
@@ -512,6 +515,8 @@ struct show_var_st init_vars[]= {
{
sys_concurrent_insert
.
name
,(
char
*
)
&
sys_concurrent_insert
,
SHOW_SYS
},
{
sys_connect_timeout
.
name
,
(
char
*
)
&
sys_connect_timeout
,
SHOW_SYS
},
{
"datadir"
,
mysql_real_data_home
,
SHOW_CHAR
},
{
"date_format"
,
(
char
*
)
&
g_datetime_frm
(
DATE_FORMAT_TYPE
),
SHOW_SYS
},
{
"datetime_format"
,
(
char
*
)
&
g_datetime_frm
(
DATETIME_FORMAT_TYPE
),
SHOW_SYS
},
{
"default_week_format"
,
(
char
*
)
&
sys_default_week_format
,
SHOW_SYS
},
{
sys_delay_key_write
.
name
,
(
char
*
)
&
sys_delay_key_write
,
SHOW_SYS
},
{
sys_delayed_insert_limit
.
name
,
(
char
*
)
&
sys_delayed_insert_limit
,
SHOW_SYS
},
...
...
@@ -661,6 +666,7 @@ struct show_var_st init_vars[]= {
#endif
{
"thread_stack"
,
(
char
*
)
&
thread_stack
,
SHOW_LONG
},
{
sys_tx_isolation
.
name
,
(
char
*
)
&
sys_tx_isolation
,
SHOW_SYS
},
{
"time_format"
,
(
char
*
)
&
g_datetime_frm
(
TIME_FORMAT_TYPE
),
SHOW_SYS
},
#ifdef HAVE_TZNAME
{
"timezone"
,
time_zone
,
SHOW_CHAR
},
#endif
...
...
@@ -671,9 +677,75 @@ struct show_var_st init_vars[]= {
{
NullS
,
NullS
,
SHOW_LONG
}
};
/*
Functions to check and update variables
*/
char
*
update_datetime_format
(
THD
*
thd
,
enum
enum_var_type
type
,
enum
datetime_format_types
format_type
,
DATETIME_FORMAT
*
tmp_format
)
{
char
*
old_value
;
if
(
type
==
OPT_GLOBAL
)
{
pthread_mutex_lock
(
&
LOCK_global_system_variables
);
old_value
=
g_datetime_frm
(
format_type
).
datetime_format
.
format
;
g_datetime_frm
(
format_type
).
datetime_format
=
*
tmp_format
;
pthread_mutex_unlock
(
&
LOCK_global_system_variables
);
}
else
{
old_value
=
t_datetime_frm
(
thd
,
format_type
).
datetime_format
.
format
;
t_datetime_frm
(
thd
,
format_type
).
datetime_format
=
*
tmp_format
;
}
return
old_value
;
}
bool
sys_var_datetime_format
::
update
(
THD
*
thd
,
set_var
*
var
)
{
DATETIME_FORMAT
tmp_format
;
char
*
old_value
;
uint
new_length
;
if
((
new_length
=
var
->
value
->
str_value
.
length
()))
{
if
(
!
make_format
(
&
tmp_format
,
format_type
,
var
->
value
->
str_value
.
ptr
(),
new_length
,
1
))
return
1
;
}
old_value
=
update_datetime_format
(
thd
,
var
->
type
,
format_type
,
&
tmp_format
);
my_free
(
old_value
,
MYF
(
MY_ALLOW_ZERO_PTR
));
return
0
;
}
byte
*
sys_var_datetime_format
::
value_ptr
(
THD
*
thd
,
enum_var_type
type
,
LEX_STRING
*
base
)
{
if
(
type
==
OPT_GLOBAL
)
return
(
byte
*
)
g_datetime_frm
(
format_type
).
datetime_format
.
format
;
return
(
byte
*
)
t_datetime_frm
(
thd
,
format_type
).
datetime_format
.
format
;
}
void
sys_var_datetime_format
::
set_default
(
THD
*
thd
,
enum_var_type
type
)
{
DATETIME_FORMAT
tmp_format
;
char
*
old_value
;
uint
new_length
;
if
((
new_length
=
strlen
(
opt_datetime_formats
[
format_type
])))
{
if
(
!
make_format
(
&
tmp_format
,
format_type
,
opt_datetime_formats
[
format_type
],
new_length
,
1
))
return
;
}
old_value
=
update_datetime_format
(
thd
,
type
,
format_type
,
&
tmp_format
);
my_free
(
old_value
,
MYF
(
MY_ALLOW_ZERO_PTR
));
}
/*
The following 3 functions need to be changed in 4.1 when we allow
...
...
sql/set_var.h
View file @
62b0b8b8
...
...
@@ -49,6 +49,8 @@ class sys_var
const
char
*
name
;
sys_after_update_func
after_update
;
sys_var
()
{}
sys_var
(
const
char
*
name_arg
)
:
name
(
name_arg
),
after_update
(
0
)
{}
sys_var
(
const
char
*
name_arg
,
sys_after_update_func
func
)
...
...
@@ -188,6 +190,9 @@ class sys_var_enum :public sys_var
class
sys_var_thd
:
public
sys_var
{
public:
sys_var_thd
()
:
sys_var
()
{}
sys_var_thd
(
const
char
*
name_arg
)
:
sys_var
(
name_arg
)
{}
...
...
@@ -538,6 +543,51 @@ class sys_var_key_buffer_size :public sys_var
};
class
sys_var_datetime_format
:
public
sys_var_thd
{
public:
enum
datetime_format_types
format_type
;
DATETIME_FORMAT
datetime_format
;
sys_var_datetime_format
()
:
sys_var_thd
()
{}
void
clean
()
{
my_free
(
datetime_format
.
format
,
MYF
(
MY_ALLOW_ZERO_PTR
));
datetime_format
.
format
=
0
;
}
/*
It's for copying of global_system_variables structure
in THD constructor.
*/
inline
sys_var_datetime_format
&
operator
=
(
sys_var_datetime_format
&
s
)
{
if
(
&
s
!=
this
)
{
name
=
s
.
name
;
name_length
=
s
.
name_length
;
datetime_format
=
s
.
datetime_format
;
datetime_format
.
format
=
(
my_strdup_with_length
(
s
.
datetime_format
.
format
,
s
.
datetime_format
.
format_length
,
MYF
(
0
)));
format_type
=
s
.
format_type
;
}
return
*
this
;
}
SHOW_TYPE
type
()
{
return
SHOW_CHAR
;
}
bool
check_update_type
(
Item_result
type
)
{
return
type
!=
STRING_RESULT
;
/* Only accept strings */
}
bool
check_default
(
enum_var_type
type
)
{
return
0
;
}
bool
update
(
THD
*
thd
,
set_var
*
var
);
byte
*
value_ptr
(
THD
*
thd
,
enum_var_type
type
,
LEX_STRING
*
base
);
void
set_default
(
THD
*
thd
,
enum_var_type
type
);
};
/* Variable that you can only read from */
class
sys_var_readonly
:
public
sys_var
...
...
sql/sql_class.cc
View file @
62b0b8b8
...
...
@@ -274,6 +274,9 @@ void THD::cleanup(void)
close_thread_tables
(
this
);
}
close_temporary_tables
(
this
);
variables
.
datetime_formats
[
DATE_FORMAT_TYPE
].
clean
();
variables
.
datetime_formats
[
TIME_FORMAT_TYPE
].
clean
();
variables
.
datetime_formats
[
DATETIME_FORMAT_TYPE
].
clean
();
delete_dynamic
(
&
user_var_events
);
hash_free
(
&
user_vars
);
if
(
global_read_lock
)
...
...
sql/sql_class.h
View file @
62b0b8b8
...
...
@@ -406,6 +406,7 @@ struct system_variables
CHARSET_INFO
*
character_set_client
;
CHARSET_INFO
*
character_set_results
;
CHARSET_INFO
*
collation_connection
;
sys_var_datetime_format
datetime_formats
[
3
];
};
void
free_tmp_table
(
THD
*
thd
,
TABLE
*
entry
);
...
...
sql/sql_yacc.yy
View file @
62b0b8b8
...
...
@@ -79,6 +79,7 @@ inline Item *or_or_concat(THD *thd, Item* A, Item* B)
CHARSET_INFO *charset;
thr_lock_type lock_type;
interval_type interval;
datetime_format_types datetime_format_type;
st_select_lex *select_lex;
chooser_compare_func_creator boolfunc2creator;
}
...
...
@@ -477,6 +478,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token GEOMETRYCOLLECTION
%token GROUP_CONCAT_SYM
%token GROUP_UNIQUE_USERS
%token GET_FORMAT
%token HOUR_MICROSECOND_SYM
%token HOUR_MINUTE_SYM
%token HOUR_SECOND_SYM
...
...
@@ -639,6 +641,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
UDF_CHAR_FUNC UDF_FLOAT_FUNC UDF_INT_FUNC
UDA_CHAR_SUM UDA_FLOAT_SUM UDA_INT_SUM
%type <datetime_format_type> datetime_format_type;
%type <interval> interval
%type <db_type> table_types
...
...
@@ -2529,6 +2532,8 @@ simple_expr:
{ $$= new Item_func_spatial_collection(* $3,
Geometry::wkbGeometryCollection,
Geometry::wkbPoint); }
| GET_FORMAT '(' datetime_format_type ',' expr ')'
{ $$= new Item_func_get_format($3, $5); }
| HOUR_SYM '(' expr ')'
{ $$= new Item_func_hour($3); }
| IF '(' expr ',' expr ',' expr ')'
...
...
@@ -3133,6 +3138,11 @@ interval:
| YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; }
| YEAR_SYM { $$=INTERVAL_YEAR; };
datetime_format_type:
DATE_SYM {$$=DATE_FORMAT_TYPE;}
| TIME_SYM {$$=TIME_FORMAT_TYPE;}
| DATETIME {$$=DATETIME_FORMAT_TYPE;};
table_alias:
/* empty */
| AS
...
...
@@ -4479,6 +4489,7 @@ keyword:
| FLUSH_SYM {}
| GEOMETRY_SYM {}
| GEOMETRYCOLLECTION {}
| GET_FORMAT {}
| GRANTS {}
| GLOBAL_SYM {}
| HANDLER_SYM {}
...
...
sql/structs.h
View file @
62b0b8b8
...
...
@@ -24,6 +24,11 @@ typedef struct st_date_format { /* How to print date */
uint
pos
[
6
];
/* Positions to YY.MM.DD HH:MM:SS */
}
DATE_FORMAT
;
typedef
struct
st_datetime_format
{
byte
dt_pos
[
8
];
char
*
format
;
uint
format_length
;
}
DATETIME_FORMAT
;
typedef
struct
st_keyfile_info
{
/* used with ha_info() */
byte
ref
[
MAX_REFLENGTH
];
/* Pointer to current row */
...
...
@@ -110,8 +115,8 @@ typedef struct st_read_record { /* Parameter to read_record */
bool
print_error
,
ignore_not_found_rows
;
}
READ_RECORD
;
enum
timestamp_type
{
TIMESTAMP_NONE
,
TIMESTAMP_DATE
,
TIMESTAMP_FULL
,
TIMESTAMP_TIME
};
enum
timestamp_type
{
TIMESTAMP_NONE
,
WRONG_TIMESTAMP_FULL
,
TIMESTAMP_DATE
,
TIMESTAMP_FULL
,
TIMESTAMP_TIME
};
typedef
struct
st_time
{
uint
year
,
month
,
day
,
hour
,
minute
,
second
;
...
...
sql/time.cc
View file @
62b0b8b8
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment