mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
Backport of TIME->MYSQL_TIME / Y2K fixset
Made year 2000 handling more uniform Removed year 2000 handling out from calc_days() The above removes some bugs in date/datetimes with year between 0 and 200 Now we get a note when we insert a datetime value into a date column For default values to CREATE, don't give errors for warning level NOTE Fixed some compiler failures Added library ws2_32 for windows compilation (needed if we want to compile with IOCP support) Removed duplicate typedef TIME and replaced it with MYSQL_TIME Better (more complete) fix for: Bug#21103 "DATE column not compared as DATE" Fixed properly Bug#18997 "DATE_ADD and DATE_SUB perform year2K autoconversion magic on 4-digit year value" Fixed Bug#23093 "Implicit conversion of 9912101 to date does not match cast(9912101 as date)"
This commit is contained in:
parent
19618b5375
commit
a65d12a830
38 changed files with 658 additions and 371 deletions
|
@ -92,6 +92,7 @@ int check_time_range(struct st_mysql_time *, int *warning);
|
|||
|
||||
long calc_daynr(uint year,uint month,uint day);
|
||||
uint calc_days_in_year(uint year);
|
||||
uint year_2000_handling(uint year);
|
||||
|
||||
void init_time(void);
|
||||
|
||||
|
|
|
@ -88,6 +88,8 @@ create table t1 (date char(30), format char(30) not null);
|
|||
insert into t1 values
|
||||
('2003-01-02 10:11:12', '%Y-%m-%d %H:%i:%S'),
|
||||
('03-01-02 8:11:2.123456', '%y-%m-%d %H:%i:%S.%#'),
|
||||
('0003-01-02 8:11:2.123456', '%Y-%m-%d %H:%i:%S.%#'),
|
||||
('03-01-02 8:11:2.123456', '%Y-%m-%d %H:%i:%S.%#'),
|
||||
('2003-01-02 10:11:12 PM', '%Y-%m-%d %h:%i:%S %p'),
|
||||
('2003-01-02 01:11:12.12345AM', '%Y-%m-%d %h:%i:%S.%f%p'),
|
||||
('2003-01-02 02:11:12.12345AM', '%Y-%m-%d %h:%i:%S.%f %p'),
|
||||
|
@ -119,6 +121,8 @@ select date,format,str_to_date(date, format) as str_to_date from t1;
|
|||
date format str_to_date
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 2003-01-02 10:11:12
|
||||
03-01-02 8:11:2.123456 %y-%m-%d %H:%i:%S.%# 2003-01-02 08:11:02
|
||||
0003-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 0003-01-02 08:11:02
|
||||
03-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 2003-01-02 08:11:02
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 2003-01-02 22:11:12
|
||||
2003-01-02 01:11:12.12345AM %Y-%m-%d %h:%i:%S.%f%p 2003-01-02 01:11:12.123450
|
||||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 2003-01-02 02:11:12.123450
|
||||
|
@ -150,6 +154,8 @@ select date,format,concat('',str_to_date(date, format)) as con from t1;
|
|||
date format con
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 2003-01-02 10:11:12
|
||||
03-01-02 8:11:2.123456 %y-%m-%d %H:%i:%S.%# 2003-01-02 08:11:02
|
||||
0003-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 0003-01-02 08:11:02
|
||||
03-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 2003-01-02 08:11:02
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 2003-01-02 22:11:12
|
||||
2003-01-02 01:11:12.12345AM %Y-%m-%d %h:%i:%S.%f%p 2003-01-02 01:11:12.123450
|
||||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 2003-01-02 02:11:12.123450
|
||||
|
@ -181,6 +187,8 @@ select date,format,cast(str_to_date(date, format) as datetime) as datetime from
|
|||
date format datetime
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 2003-01-02 10:11:12
|
||||
03-01-02 8:11:2.123456 %y-%m-%d %H:%i:%S.%# 2003-01-02 08:11:02
|
||||
0003-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 0003-01-02 08:11:02
|
||||
03-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 2003-01-02 08:11:02
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 2003-01-02 22:11:12
|
||||
2003-01-02 01:11:12.12345AM %Y-%m-%d %h:%i:%S.%f%p 2003-01-02 01:11:12.123450
|
||||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 2003-01-02 02:11:12.123450
|
||||
|
@ -212,6 +220,8 @@ select date,format,DATE(str_to_date(date, format)) as date2 from t1;
|
|||
date format date2
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 2003-01-02
|
||||
03-01-02 8:11:2.123456 %y-%m-%d %H:%i:%S.%# 2003-01-02
|
||||
0003-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 0003-01-02
|
||||
03-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 2003-01-02
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 2003-01-02
|
||||
2003-01-02 01:11:12.12345AM %Y-%m-%d %h:%i:%S.%f%p 2003-01-02
|
||||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 2003-01-02
|
||||
|
@ -243,6 +253,8 @@ select date,format,TIME(str_to_date(date, format)) as time from t1;
|
|||
date format time
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 10:11:12
|
||||
03-01-02 8:11:2.123456 %y-%m-%d %H:%i:%S.%# 08:11:02
|
||||
0003-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 08:11:02
|
||||
03-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 08:11:02
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 22:11:12
|
||||
2003-01-02 01:11:12.12345AM %Y-%m-%d %h:%i:%S.%f%p 01:11:12.123450
|
||||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 02:11:12.123450
|
||||
|
@ -274,6 +286,8 @@ select date,format,concat(TIME(str_to_date(date, format))) as time2 from t1;
|
|||
date format time2
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 10:11:12
|
||||
03-01-02 8:11:2.123456 %y-%m-%d %H:%i:%S.%# 08:11:02
|
||||
0003-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 08:11:02
|
||||
03-01-02 8:11:2.123456 %Y-%m-%d %H:%i:%S.%# 08:11:02
|
||||
2003-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 22:11:12
|
||||
2003-01-02 01:11:12.12345AM %Y-%m-%d %h:%i:%S.%f%p 01:11:12.123450
|
||||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 02:11:12.123450
|
||||
|
@ -399,14 +413,14 @@ select date,format,str_to_date(date, format) as str_to_date from t1;
|
|||
date format str_to_date
|
||||
10:20:10AM %h:%i:%s 0000-00-00 10:20:10
|
||||
2003-01-02 10:11:12 %Y-%m-%d %h:%i:%S 2003-01-02 10:11:12
|
||||
03-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 0003-01-02 22:11:12
|
||||
03-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 2003-01-02 22:11:12
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '10:20:10AM'
|
||||
select date,format,concat(str_to_date(date, format),'') as con from t1;
|
||||
date format con
|
||||
10:20:10AM %h:%i:%s 0000-00-00 10:20:10
|
||||
2003-01-02 10:11:12 %Y-%m-%d %h:%i:%S 2003-01-02 10:11:12
|
||||
03-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 0003-01-02 22:11:12
|
||||
03-01-02 10:11:12 PM %Y-%m-%d %h:%i:%S %p 2003-01-02 22:11:12
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '10:20:10AM'
|
||||
drop table t1;
|
||||
|
|
|
@ -75,6 +75,12 @@ NULL
|
|||
select weekofyear("1997-11-30 23:59:59.000001");
|
||||
weekofyear("1997-11-30 23:59:59.000001")
|
||||
48
|
||||
select makedate(03,1);
|
||||
makedate(03,1)
|
||||
2003-01-01
|
||||
select makedate('0003',1);
|
||||
makedate('0003',1)
|
||||
2003-01-01
|
||||
select makedate(1997,1);
|
||||
makedate(1997,1)
|
||||
1997-01-01
|
||||
|
|
|
@ -2961,20 +2961,26 @@ delete from t9 ;
|
|||
test_sequence
|
||||
-- insert into date/time columns --
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'c13' at row 1
|
||||
|
@ -3005,6 +3011,7 @@ Warning 1265 Data truncated for column 'c15' at row 1
|
|||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c15' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
|
|
|
@ -2944,20 +2944,26 @@ delete from t9 ;
|
|||
test_sequence
|
||||
-- insert into date/time columns --
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'c13' at row 1
|
||||
|
@ -2988,6 +2994,7 @@ Warning 1265 Data truncated for column 'c15' at row 1
|
|||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c15' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
|
|
|
@ -2945,20 +2945,26 @@ delete from t9 ;
|
|||
test_sequence
|
||||
-- insert into date/time columns --
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'c13' at row 1
|
||||
|
@ -2989,6 +2995,7 @@ Warning 1265 Data truncated for column 'c15' at row 1
|
|||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c15' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
|
|
|
@ -2881,20 +2881,26 @@ delete from t9 ;
|
|||
test_sequence
|
||||
-- insert into date/time columns --
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'c13' at row 1
|
||||
|
@ -2925,6 +2931,7 @@ Warning 1265 Data truncated for column 'c15' at row 1
|
|||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c15' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
|
@ -5895,20 +5902,26 @@ delete from t9 ;
|
|||
test_sequence
|
||||
-- insert into date/time columns --
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'c13' at row 1
|
||||
|
@ -5939,6 +5952,7 @@ Warning 1265 Data truncated for column 'c15' at row 1
|
|||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c15' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
|
|
|
@ -2944,20 +2944,26 @@ delete from t9 ;
|
|||
test_sequence
|
||||
-- insert into date/time columns --
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c17' at row 1
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'c13' at row 1
|
||||
|
@ -2988,6 +2994,7 @@ Warning 1265 Data truncated for column 'c15' at row 1
|
|||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'c13' at row 1
|
||||
Warning 1265 Data truncated for column 'c15' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c16' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'c17' at row 1
|
||||
|
|
|
@ -206,6 +206,8 @@ INSERT INTO t1 (col1) VALUES (STR_TO_DATE('15.10.2004','%d.%m.%Y'));
|
|||
INSERT INTO t1 (col2) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i'));
|
||||
INSERT INTO t1 (col3) VALUES (STR_TO_DATE('15.10.2004 10.15','%d.%m.%Y %H.%i'));
|
||||
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.10.0000 15.30','%d.%m.%Y %H.%i'));
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'col1' at row 1
|
||||
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('31.0.2004 15.30','%d.%m.%Y %H.%i'));
|
||||
ERROR 22007: Incorrect date value: '2004-00-31 15:30:00' for column 'col1' at row 1
|
||||
INSERT INTO t1 (col1) VALUES(STR_TO_DATE('0.10.2004 15.30','%d.%m.%Y %H.%i'));
|
||||
|
|
|
@ -110,3 +110,29 @@ select 1 from t1 where cast('2000-01-01 12:01:01' as datetime) between start_dat
|
|||
1
|
||||
1
|
||||
drop table t1;
|
||||
select @d:=1111, year(@d), month(@d), day(@d), cast(@d as date);
|
||||
@d:=1111 year(@d) month(@d) day(@d) cast(@d as date)
|
||||
1111 2000 11 11 2000-11-11
|
||||
select @d:=011111, year(@d), month(@d), day(@d), cast(@d as date);
|
||||
@d:=011111 year(@d) month(@d) day(@d) cast(@d as date)
|
||||
11111 2001 11 11 2001-11-11
|
||||
select @d:=1311, year(@d), month(@d), day(@d), cast(@d as date);
|
||||
@d:=1311 year(@d) month(@d) day(@d) cast(@d as date)
|
||||
1311 NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '1311'
|
||||
Warning 1292 Truncated incorrect datetime value: '1311'
|
||||
Warning 1292 Truncated incorrect datetime value: '1311'
|
||||
Warning 1292 Truncated incorrect datetime value: '1311'
|
||||
create table t1 (d date , dt datetime , ts timestamp);
|
||||
insert into t1 values (9912101,9912101,9912101);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value adjusted for column 'd' at row 1
|
||||
Warning 1264 Out of range value adjusted for column 'dt' at row 1
|
||||
Warning 1265 Data truncated for column 'ts' at row 1
|
||||
insert into t1 values (11111,11111,11111);
|
||||
select * from t1;
|
||||
d dt ts
|
||||
0000-00-00 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
2001-11-11 2001-11-11 00:00:00 2001-11-11 00:00:00
|
||||
drop table t1;
|
||||
|
|
|
@ -192,6 +192,41 @@ CAST(CAST('2006-08-10 10:11:12' AS DATETIME) + INTERVAL 14 MICROSECOND AS DECIMA
|
|||
SELECT CAST(CAST('10:11:12.098700' AS TIME) AS DECIMAL(20,6));
|
||||
CAST(CAST('10:11:12.098700' AS TIME) AS DECIMAL(20,6))
|
||||
101112.098700
|
||||
set @org_mode=@@sql_mode;
|
||||
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'da' at row 1
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`da` date default '1962-03-03',
|
||||
`dt` datetime default '1962-03-03 00:00:00'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
insert into t1 values ();
|
||||
insert into t1 values ('2007-03-23 13:49:38','2007-03-23 13:49:38');
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'da' at row 1
|
||||
set @@sql_mode='ansi,traditional';
|
||||
insert into t1 values ('2007-03-23 13:49:38','2007-03-23 13:49:38');
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'da' at row 1
|
||||
insert into t1 set dt='2007-03-23 13:49:38',da=dt;
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'da' at row 1
|
||||
insert into t1 values ('2007-03-32','2007-03-23 13:49:38');
|
||||
ERROR 22007: Incorrect date value: '2007-03-32' for column 'da' at row 1
|
||||
select * from t1;
|
||||
da dt
|
||||
1962-03-03 1962-03-03 00:00:00
|
||||
2007-03-23 2007-03-23 13:49:38
|
||||
2007-03-23 2007-03-23 13:49:38
|
||||
2007-03-23 2007-03-23 13:49:38
|
||||
drop table t1;
|
||||
create table t1 (da date default '1962-03-32 23:33:34', dt datetime default '1962-03-03');
|
||||
ERROR 42000: Invalid default value for 'da'
|
||||
create table t1 (t time default '916:00:00 a');
|
||||
ERROR 42000: Invalid default value for 't'
|
||||
set @@sql_mode= @org_mode;
|
||||
create table t1 (f1 date, f2 datetime, f3 timestamp);
|
||||
insert into t1(f1) values(curdate());
|
||||
select curdate() < now(), f1 < now(), cast(f1 as date) < now() from t1;
|
||||
|
|
|
@ -129,6 +129,8 @@ create table t1 (date char(30), format char(30) not null);
|
|||
insert into t1 values
|
||||
('2003-01-02 10:11:12', '%Y-%m-%d %H:%i:%S'),
|
||||
('03-01-02 8:11:2.123456', '%y-%m-%d %H:%i:%S.%#'),
|
||||
('0003-01-02 8:11:2.123456', '%Y-%m-%d %H:%i:%S.%#'),
|
||||
('03-01-02 8:11:2.123456', '%Y-%m-%d %H:%i:%S.%#'),
|
||||
('2003-01-02 10:11:12 PM', '%Y-%m-%d %h:%i:%S %p'),
|
||||
('2003-01-02 01:11:12.12345AM', '%Y-%m-%d %h:%i:%S.%f%p'),
|
||||
('2003-01-02 02:11:12.12345AM', '%Y-%m-%d %h:%i:%S.%f %p'),
|
||||
|
|
|
@ -41,6 +41,8 @@ select datediff("1997-11-30 23:59:59.000001",null);
|
|||
|
||||
select weekofyear("1997-11-30 23:59:59.000001");
|
||||
|
||||
select makedate(03,1);
|
||||
select makedate('0003',1);
|
||||
select makedate(1997,1);
|
||||
select makedate(1997,0);
|
||||
select makedate(9999,365);
|
||||
|
|
|
@ -123,3 +123,16 @@ insert into t1 values ('2000-01-01','2000-01-02');
|
|||
select 1 from t1 where cast('2000-01-01 12:01:01' as datetime) between start_date and end_date;
|
||||
drop table t1;
|
||||
# End of 4.1 tests
|
||||
|
||||
#
|
||||
# Bug #23093: Implicit conversion of 9912101 to date does not match
|
||||
# cast(9912101 as date)
|
||||
#
|
||||
select @d:=1111, year(@d), month(@d), day(@d), cast(@d as date);
|
||||
select @d:=011111, year(@d), month(@d), day(@d), cast(@d as date);
|
||||
select @d:=1311, year(@d), month(@d), day(@d), cast(@d as date);
|
||||
create table t1 (d date , dt datetime , ts timestamp);
|
||||
insert into t1 values (9912101,9912101,9912101);
|
||||
insert into t1 values (11111,11111,11111);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -141,6 +141,31 @@ SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME) AS DECIMAL(20,6));
|
|||
SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6));
|
||||
SELECT CAST(CAST('10:11:12.098700' AS TIME) AS DECIMAL(20,6));
|
||||
|
||||
|
||||
#
|
||||
# Test of storing datetime into date fields
|
||||
#
|
||||
|
||||
set @org_mode=@@sql_mode;
|
||||
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
|
||||
show create table t1;
|
||||
insert into t1 values ();
|
||||
insert into t1 values ('2007-03-23 13:49:38','2007-03-23 13:49:38');
|
||||
set @@sql_mode='ansi,traditional';
|
||||
insert into t1 values ('2007-03-23 13:49:38','2007-03-23 13:49:38');
|
||||
insert into t1 set dt='2007-03-23 13:49:38',da=dt;
|
||||
# Test error handling
|
||||
--error 1292
|
||||
insert into t1 values ('2007-03-32','2007-03-23 13:49:38');
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
--error 1067
|
||||
create table t1 (da date default '1962-03-32 23:33:34', dt datetime default '1962-03-03');
|
||||
--error 1067
|
||||
create table t1 (t time default '916:00:00 a');
|
||||
set @@sql_mode= @org_mode;
|
||||
|
||||
|
||||
#
|
||||
# Bug#27590: Wrong DATE/DATETIME comparison.
|
||||
#
|
||||
|
|
|
@ -727,7 +727,39 @@ void init_time(void)
|
|||
}
|
||||
|
||||
|
||||
/* Calculate nr of day since year 0 in new date-system (from 1615) */
|
||||
/*
|
||||
Handle 2 digit year conversions
|
||||
|
||||
SYNOPSIS
|
||||
year_2000_handling()
|
||||
year 2 digit year
|
||||
|
||||
RETURN
|
||||
Year between 1970-2069
|
||||
*/
|
||||
|
||||
uint year_2000_handling(uint year)
|
||||
{
|
||||
if ((year=year+1900) < 1900+YY_PART_YEAR)
|
||||
year+=100;
|
||||
return year;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Calculate nr of day since year 0 in new date-system (from 1615)
|
||||
|
||||
SYNOPSIS
|
||||
calc_daynr()
|
||||
year Year (exact 4 digit year, no year conversions)
|
||||
month Month
|
||||
day Day
|
||||
|
||||
NOTES: 0000-00-00 is a valid date, and will return 0
|
||||
|
||||
RETURN
|
||||
Days since 0000-00-00
|
||||
*/
|
||||
|
||||
long calc_daynr(uint year,uint month,uint day)
|
||||
{
|
||||
|
|
124
sql/field.cc
124
sql/field.cc
|
@ -1550,7 +1550,7 @@ uint Field::fill_cache_field(CACHE_FIELD *copy)
|
|||
}
|
||||
|
||||
|
||||
bool Field::get_date(TIME *ltime,uint fuzzydate)
|
||||
bool Field::get_date(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
|
||||
|
@ -1561,7 +1561,7 @@ bool Field::get_date(TIME *ltime,uint fuzzydate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool Field::get_time(TIME *ltime)
|
||||
bool Field::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
|
||||
|
@ -1578,7 +1578,7 @@ bool Field::get_time(TIME *ltime)
|
|||
Needs to be changed if/when we want to support different time formats
|
||||
*/
|
||||
|
||||
int Field::store_time(TIME *ltime, timestamp_type type_arg)
|
||||
int Field::store_time(MYSQL_TIME *ltime, timestamp_type type_arg)
|
||||
{
|
||||
char buff[MAX_DATE_STRING_REP_LENGTH];
|
||||
uint length= (uint) my_TIME_to_str(ltime, buff);
|
||||
|
@ -2504,7 +2504,7 @@ int Field_new_decimal::store_decimal(const my_decimal *decimal_value)
|
|||
}
|
||||
|
||||
|
||||
int Field_new_decimal::store_time(TIME *ltime, timestamp_type t_type)
|
||||
int Field_new_decimal::store_time(MYSQL_TIME *ltime, timestamp_type t_type)
|
||||
{
|
||||
my_decimal decimal_value;
|
||||
return store_value(date2my_decimal(ltime, &decimal_value));
|
||||
|
@ -4359,7 +4359,8 @@ timestamp_auto_set_type Field_timestamp::get_auto_set_type() const
|
|||
|
||||
int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
TIME l_time;
|
||||
|
||||
MYSQL_TIME l_time;
|
||||
my_time_t tmp= 0;
|
||||
int error;
|
||||
bool have_smth_to_conv;
|
||||
|
@ -4429,7 +4430,7 @@ int Field_timestamp::store(double nr)
|
|||
|
||||
int Field_timestamp::store(longlong nr, bool unsigned_val)
|
||||
{
|
||||
TIME l_time;
|
||||
MYSQL_TIME l_time;
|
||||
my_time_t timestamp= 0;
|
||||
int error;
|
||||
my_bool in_dst_time_gap;
|
||||
|
@ -4486,7 +4487,7 @@ double Field_timestamp::val_real(void)
|
|||
longlong Field_timestamp::val_int(void)
|
||||
{
|
||||
uint32 temp;
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
|
@ -4511,7 +4512,7 @@ longlong Field_timestamp::val_int(void)
|
|||
String *Field_timestamp::val_str(String *val_buffer, String *val_ptr)
|
||||
{
|
||||
uint32 temp, temp2;
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
char *to;
|
||||
|
||||
|
@ -4580,7 +4581,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(MYSQL_TIME *ltime, uint fuzzydate)
|
||||
{
|
||||
long temp;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
@ -4604,7 +4605,7 @@ bool Field_timestamp::get_date(TIME *ltime, uint fuzzydate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool Field_timestamp::get_time(TIME *ltime)
|
||||
bool Field_timestamp::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
return Field_timestamp::get_date(ltime,0);
|
||||
}
|
||||
|
@ -4612,7 +4613,7 @@ bool Field_timestamp::get_time(TIME *ltime)
|
|||
|
||||
bool Field_timestamp::send_binary(Protocol *protocol)
|
||||
{
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
Field_timestamp::get_date(&tm, 0);
|
||||
return protocol->store(&tm);
|
||||
}
|
||||
|
@ -4688,7 +4689,7 @@ void Field_timestamp::set_time()
|
|||
|
||||
int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
long tmp;
|
||||
int error= 0;
|
||||
int warning;
|
||||
|
@ -4703,9 +4704,12 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||
else
|
||||
{
|
||||
if (warning & MYSQL_TIME_WARN_TRUNCATED)
|
||||
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
{
|
||||
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
WARN_DATA_TRUNCATED,
|
||||
from, len, MYSQL_TIMESTAMP_TIME, 1);
|
||||
error= 1;
|
||||
}
|
||||
if (warning & MYSQL_TIME_WARN_OUT_OF_RANGE)
|
||||
{
|
||||
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
|
@ -4716,8 +4720,6 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||
if (ltime.month)
|
||||
ltime.day=0;
|
||||
tmp=(ltime.day*24L+ltime.hour)*10000L+(ltime.minute*100+ltime.second);
|
||||
if (error > 1)
|
||||
error= 2;
|
||||
}
|
||||
|
||||
if (ltime.neg)
|
||||
|
@ -4727,7 +4729,7 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||
}
|
||||
|
||||
|
||||
int Field_time::store_time(TIME *ltime, timestamp_type time_type)
|
||||
int Field_time::store_time(MYSQL_TIME *ltime, timestamp_type time_type)
|
||||
{
|
||||
long tmp= ((ltime->month ? 0 : ltime->day * 24L) + ltime->hour) * 10000L +
|
||||
(ltime->minute * 100 + ltime->second);
|
||||
|
@ -4831,7 +4833,7 @@ longlong Field_time::val_int(void)
|
|||
String *Field_time::val_str(String *val_buffer,
|
||||
String *val_ptr __attribute__((unused)))
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
val_buffer->alloc(19);
|
||||
long tmp=(long) sint3korr(ptr);
|
||||
ltime.neg= 0;
|
||||
|
@ -4855,7 +4857,7 @@ String *Field_time::val_str(String *val_buffer,
|
|||
DATE_FORMAT(time, "%l.%i %p")
|
||||
*/
|
||||
|
||||
bool Field_time::get_date(TIME *ltime, uint fuzzydate)
|
||||
bool Field_time::get_date(MYSQL_TIME *ltime, uint fuzzydate)
|
||||
{
|
||||
long tmp;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
@ -4883,7 +4885,7 @@ bool Field_time::get_date(TIME *ltime, uint fuzzydate)
|
|||
}
|
||||
|
||||
|
||||
bool Field_time::get_time(TIME *ltime)
|
||||
bool Field_time::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
long tmp=(long) sint3korr(ptr);
|
||||
ltime->neg=0;
|
||||
|
@ -4905,7 +4907,7 @@ bool Field_time::get_time(TIME *ltime)
|
|||
|
||||
bool Field_time::send_binary(Protocol *protocol)
|
||||
{
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
Field_time::get_time(&tm);
|
||||
tm.day= tm.hour/24; // Move hours to days
|
||||
tm.hour-= tm.day*24;
|
||||
|
@ -5058,7 +5060,7 @@ void Field_year::sql_type(String &res) const
|
|||
|
||||
int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
TIME l_time;
|
||||
MYSQL_TIME l_time;
|
||||
uint32 tmp;
|
||||
int error;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
@ -5114,7 +5116,7 @@ int Field_date::store(double nr)
|
|||
|
||||
int Field_date::store(longlong nr, bool unsigned_val)
|
||||
{
|
||||
TIME not_used;
|
||||
MYSQL_TIME not_used;
|
||||
int error;
|
||||
longlong initial_nr= nr;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
@ -5155,7 +5157,7 @@ int Field_date::store(longlong nr, bool unsigned_val)
|
|||
bool Field_date::send_binary(Protocol *protocol)
|
||||
{
|
||||
longlong tmp= Field_date::val_int();
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
tm.year= (uint32) tmp/10000L % 10000;
|
||||
tm.month= (uint32) tmp/100 % 100;
|
||||
tm.day= (uint32) tmp % 100;
|
||||
|
@ -5192,7 +5194,7 @@ longlong Field_date::val_int(void)
|
|||
String *Field_date::val_str(String *val_buffer,
|
||||
String *val_ptr __attribute__((unused)))
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
val_buffer->alloc(field_length);
|
||||
int32 tmp;
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
|
@ -5261,9 +5263,26 @@ void Field_date::sql_type(String &res) const
|
|||
** In number context: YYYYMMDD
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
Store string into a date field
|
||||
|
||||
SYNOPSIS
|
||||
Field_newdate::store()
|
||||
from Date string
|
||||
len Length of date field
|
||||
cs Character set (not used)
|
||||
|
||||
RETURN
|
||||
0 ok
|
||||
1 Value was cut during conversion
|
||||
2 Wrong date string
|
||||
3 Datetime value that was cut (warning level NOTE)
|
||||
*/
|
||||
|
||||
int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
TIME l_time;
|
||||
long tmp;
|
||||
MYSQL_TIME l_time;
|
||||
int error;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
enum enum_mysql_timestamp_type ret;
|
||||
|
@ -5274,20 +5293,23 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
|
|||
MODE_INVALID_DATES))),
|
||||
&error)) <= MYSQL_TIMESTAMP_ERROR)
|
||||
{
|
||||
int3store(ptr,0L);
|
||||
tmp= 0;
|
||||
error= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
int3store(ptr, l_time.day + l_time.month*32 + l_time.year*16*32);
|
||||
if(!error && (ret != MYSQL_TIMESTAMP_DATE))
|
||||
return 2;
|
||||
tmp= l_time.day + l_time.month*32 + l_time.year*16*32;
|
||||
if (!error && (ret != MYSQL_TIMESTAMP_DATE))
|
||||
error= 3; // Datetime was cut (note)
|
||||
}
|
||||
|
||||
if (error)
|
||||
set_datetime_warning(MYSQL_ERROR::WARN_LEVEL_WARN, WARN_DATA_TRUNCATED,
|
||||
set_datetime_warning(error == 3 ? MYSQL_ERROR::WARN_LEVEL_NOTE :
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
WARN_DATA_TRUNCATED,
|
||||
from, len, MYSQL_TIMESTAMP_DATE, 1);
|
||||
|
||||
int3store(ptr, tmp);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -5307,7 +5329,7 @@ int Field_newdate::store(double nr)
|
|||
|
||||
int Field_newdate::store(longlong nr, bool unsigned_val)
|
||||
{
|
||||
TIME l_time;
|
||||
MYSQL_TIME l_time;
|
||||
longlong tmp;
|
||||
int error;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
@ -5334,7 +5356,7 @@ int Field_newdate::store(longlong nr, bool unsigned_val)
|
|||
}
|
||||
|
||||
|
||||
int Field_newdate::store_time(TIME *ltime, timestamp_type time_type)
|
||||
int Field_newdate::store_time(MYSQL_TIME *ltime, timestamp_type time_type)
|
||||
{
|
||||
long tmp;
|
||||
int error= 0;
|
||||
|
@ -5368,7 +5390,7 @@ int Field_newdate::store_time(TIME *ltime, timestamp_type time_type)
|
|||
|
||||
bool Field_newdate::send_binary(Protocol *protocol)
|
||||
{
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
Field_newdate::get_date(&tm,0);
|
||||
return protocol->store_date(&tm);
|
||||
}
|
||||
|
@ -5416,7 +5438,7 @@ String *Field_newdate::val_str(String *val_buffer,
|
|||
}
|
||||
|
||||
|
||||
bool Field_newdate::get_date(TIME *ltime,uint fuzzydate)
|
||||
bool Field_newdate::get_date(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
uint32 tmp=(uint32) uint3korr(ptr);
|
||||
ltime->day= tmp & 31;
|
||||
|
@ -5429,7 +5451,7 @@ bool Field_newdate::get_date(TIME *ltime,uint fuzzydate)
|
|||
}
|
||||
|
||||
|
||||
bool Field_newdate::get_time(TIME *ltime)
|
||||
bool Field_newdate::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
return Field_newdate::get_date(ltime,0);
|
||||
}
|
||||
|
@ -5467,7 +5489,7 @@ void Field_newdate::sql_type(String &res) const
|
|||
|
||||
int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs)
|
||||
{
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
int error;
|
||||
ulonglong tmp= 0;
|
||||
enum enum_mysql_timestamp_type func_res;
|
||||
|
@ -5519,7 +5541,7 @@ int Field_datetime::store(double nr)
|
|||
|
||||
int Field_datetime::store(longlong nr, bool unsigned_val)
|
||||
{
|
||||
TIME not_used;
|
||||
MYSQL_TIME not_used;
|
||||
int error;
|
||||
longlong initial_nr= nr;
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
|
@ -5554,12 +5576,12 @@ int Field_datetime::store(longlong nr, bool unsigned_val)
|
|||
}
|
||||
|
||||
|
||||
int Field_datetime::store_time(TIME *ltime,timestamp_type time_type)
|
||||
int Field_datetime::store_time(MYSQL_TIME *ltime,timestamp_type time_type)
|
||||
{
|
||||
longlong tmp;
|
||||
int error= 0;
|
||||
/*
|
||||
We don't perform range checking here since values stored in TIME
|
||||
We don't perform range checking here since values stored in MYSQL_TIME
|
||||
structure always fit into DATETIME range.
|
||||
*/
|
||||
if (time_type == MYSQL_TIMESTAMP_DATE ||
|
||||
|
@ -5599,7 +5621,7 @@ int Field_datetime::store_time(TIME *ltime,timestamp_type time_type)
|
|||
|
||||
bool Field_datetime::send_binary(Protocol *protocol)
|
||||
{
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
Field_datetime::get_date(&tm, TIME_FUZZY_DATE);
|
||||
return protocol->store(&tm);
|
||||
}
|
||||
|
@ -5671,7 +5693,7 @@ String *Field_datetime::val_str(String *val_buffer,
|
|||
return val_buffer;
|
||||
}
|
||||
|
||||
bool Field_datetime::get_date(TIME *ltime, uint fuzzydate)
|
||||
bool Field_datetime::get_date(MYSQL_TIME *ltime, uint fuzzydate)
|
||||
{
|
||||
longlong tmp=Field_datetime::val_int();
|
||||
uint32 part1,part2;
|
||||
|
@ -5690,7 +5712,7 @@ bool Field_datetime::get_date(TIME *ltime, uint fuzzydate)
|
|||
return (!(fuzzydate & TIME_FUZZY_DATE) && (!ltime->month || !ltime->day)) ? 1 : 0;
|
||||
}
|
||||
|
||||
bool Field_datetime::get_time(TIME *ltime)
|
||||
bool Field_datetime::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
return Field_datetime::get_date(ltime,0);
|
||||
}
|
||||
|
@ -9060,10 +9082,13 @@ uint32 Field_blob::max_display_length()
|
|||
|
||||
NOTE
|
||||
This function won't produce warning and increase cut fields counter
|
||||
if count_cuted_fields == FIELD_CHECK_IGNORE for current thread.
|
||||
if count_cuted_fields == CHECK_FIELD_IGNORE for current thread.
|
||||
|
||||
if count_cuted_fields == CHECK_FIELD_IGNORE then we ignore notes.
|
||||
This allows us to avoid notes in optimisation, like convert_constant_item().
|
||||
|
||||
RETURN VALUE
|
||||
1 if count_cuted_fields == FIELD_CHECK_IGNORE
|
||||
1 if count_cuted_fields == CHECK_FIELD_IGNORE and error level is not NOTE
|
||||
0 otherwise
|
||||
*/
|
||||
|
||||
|
@ -9083,7 +9108,7 @@ Field::set_warning(MYSQL_ERROR::enum_warning_level level, uint code,
|
|||
thd->row_count);
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
return level >= MYSQL_ERROR::WARN_LEVEL_WARN;
|
||||
}
|
||||
|
||||
|
||||
|
@ -9111,9 +9136,10 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code,
|
|||
timestamp_type ts_type, int cuted_increment)
|
||||
{
|
||||
THD *thd= table ? table->in_use : current_thd;
|
||||
if (thd->really_abort_on_warning() ||
|
||||
if ((thd->really_abort_on_warning() &&
|
||||
level >= MYSQL_ERROR::WARN_LEVEL_WARN) ||
|
||||
set_warning(level, code, cuted_increment))
|
||||
make_truncated_value_warning(thd, str, str_length, ts_type,
|
||||
make_truncated_value_warning(thd, level, str, str_length, ts_type,
|
||||
field_name);
|
||||
}
|
||||
|
||||
|
@ -9146,7 +9172,7 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code,
|
|||
{
|
||||
char str_nr[22];
|
||||
char *str_end= longlong10_to_str(nr, str_nr, -10);
|
||||
make_truncated_value_warning(thd, str_nr, (uint) (str_end - str_nr),
|
||||
make_truncated_value_warning(thd, level, str_nr, (uint) (str_end - str_nr),
|
||||
ts_type, field_name);
|
||||
}
|
||||
}
|
||||
|
@ -9179,7 +9205,7 @@ Field::set_datetime_warning(MYSQL_ERROR::enum_warning_level level, uint code,
|
|||
/* DBL_DIG is enough to print '-[digits].E+###' */
|
||||
char str_nr[DBL_DIG + 8];
|
||||
uint str_len= my_sprintf(str_nr, (str_nr, "%g", nr));
|
||||
make_truncated_value_warning(thd, str_nr, str_len, ts_type,
|
||||
make_truncated_value_warning(thd, level, str_nr, str_len, ts_type,
|
||||
field_name);
|
||||
}
|
||||
}
|
||||
|
|
30
sql/field.h
30
sql/field.h
|
@ -98,7 +98,7 @@ public:
|
|||
virtual int store(double nr)=0;
|
||||
virtual int store(longlong nr, bool unsigned_val)=0;
|
||||
virtual int store_decimal(const my_decimal *d)=0;
|
||||
virtual int store_time(TIME *ltime, timestamp_type t_type);
|
||||
virtual int store_time(MYSQL_TIME *ltime, timestamp_type t_type);
|
||||
virtual double val_real(void)=0;
|
||||
virtual longlong val_int(void)=0;
|
||||
virtual my_decimal *val_decimal(my_decimal *);
|
||||
|
@ -326,8 +326,8 @@ public:
|
|||
uint offset(); // Should be inline ...
|
||||
void copy_from_tmp(int offset);
|
||||
uint fill_cache_field(struct st_cache_field *copy);
|
||||
virtual bool get_date(TIME *ltime,uint fuzzydate);
|
||||
virtual bool get_time(TIME *ltime);
|
||||
virtual bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
virtual bool get_time(MYSQL_TIME *ltime);
|
||||
virtual CHARSET_INFO *charset(void) const { return &my_charset_bin; }
|
||||
virtual CHARSET_INFO *sort_charset(void) const { return charset(); }
|
||||
virtual bool has_charset(void) const { return FALSE; }
|
||||
|
@ -529,7 +529,7 @@ public:
|
|||
int store(const char *to, uint length, CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int store_time(TIME *ltime, timestamp_type t_type);
|
||||
int store_time(MYSQL_TIME *ltime, timestamp_type t_type);
|
||||
int store_decimal(const my_decimal *);
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
|
@ -879,8 +879,8 @@ public:
|
|||
longget(tmp,ptr);
|
||||
return tmp;
|
||||
}
|
||||
bool get_date(TIME *ltime,uint fuzzydate);
|
||||
bool get_time(TIME *ltime);
|
||||
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
bool get_time(MYSQL_TIME *ltime);
|
||||
timestamp_auto_set_type get_auto_set_type() const;
|
||||
};
|
||||
|
||||
|
@ -953,7 +953,7 @@ public:
|
|||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int store_time(TIME *ltime, timestamp_type type);
|
||||
int store_time(MYSQL_TIME *ltime, timestamp_type type);
|
||||
int reset(void) { ptr[0]=ptr[1]=ptr[2]=0; return 0; }
|
||||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
|
@ -965,8 +965,8 @@ public:
|
|||
void sql_type(String &str) const;
|
||||
bool can_be_compared_as_longlong() const { return TRUE; }
|
||||
bool zero_pack() const { return 1; }
|
||||
bool get_date(TIME *ltime,uint fuzzydate);
|
||||
bool get_time(TIME *ltime);
|
||||
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
bool get_time(MYSQL_TIME *ltime);
|
||||
};
|
||||
|
||||
|
||||
|
@ -985,7 +985,7 @@ public:
|
|||
enum_field_types type() const { return FIELD_TYPE_TIME;}
|
||||
enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; }
|
||||
enum Item_result cmp_type () const { return INT_RESULT; }
|
||||
int store_time(TIME *ltime, timestamp_type type);
|
||||
int store_time(MYSQL_TIME *ltime, timestamp_type type);
|
||||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
|
@ -993,9 +993,9 @@ public:
|
|||
double val_real(void);
|
||||
longlong val_int(void);
|
||||
String *val_str(String*,String *);
|
||||
bool get_date(TIME *ltime, uint fuzzydate);
|
||||
bool get_date(MYSQL_TIME *ltime, uint fuzzydate);
|
||||
bool send_binary(Protocol *protocol);
|
||||
bool get_time(TIME *ltime);
|
||||
bool get_time(MYSQL_TIME *ltime);
|
||||
int cmp(const char *,const char*);
|
||||
void sort_string(char *buff,uint length);
|
||||
uint32 pack_length() const { return 3; }
|
||||
|
@ -1026,7 +1026,7 @@ public:
|
|||
int store(const char *to,uint length,CHARSET_INFO *charset);
|
||||
int store(double nr);
|
||||
int store(longlong nr, bool unsigned_val);
|
||||
int store_time(TIME *ltime, timestamp_type type);
|
||||
int store_time(MYSQL_TIME *ltime, timestamp_type type);
|
||||
int reset(void)
|
||||
{
|
||||
ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0;
|
||||
|
@ -1042,8 +1042,8 @@ public:
|
|||
void sql_type(String &str) const;
|
||||
bool can_be_compared_as_longlong() const { return TRUE; }
|
||||
bool zero_pack() const { return 1; }
|
||||
bool get_date(TIME *ltime,uint fuzzydate);
|
||||
bool get_time(TIME *ltime);
|
||||
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
bool get_time(MYSQL_TIME *ltime);
|
||||
};
|
||||
|
||||
|
||||
|
|
73
sql/item.cc
73
sql/item.cc
|
@ -270,7 +270,7 @@ my_decimal *Item::val_decimal_from_string(my_decimal *decimal_value)
|
|||
my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||
{
|
||||
my_decimal_set_zero(decimal_value);
|
||||
|
@ -283,7 +283,7 @@ my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
|
|||
my_decimal *Item::val_decimal_from_time(my_decimal *decimal_value)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_time(<ime))
|
||||
{
|
||||
my_decimal_set_zero(decimal_value);
|
||||
|
@ -318,7 +318,7 @@ longlong Item::val_int_from_decimal()
|
|||
|
||||
int Item::save_time_in_field(Field *field)
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_time(<ime))
|
||||
return set_field_to_null(field);
|
||||
field->set_notnull();
|
||||
|
@ -328,7 +328,7 @@ int Item::save_time_in_field(Field *field)
|
|||
|
||||
int Item::save_date_in_field(Field *field)
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||
return set_field_to_null(field);
|
||||
field->set_notnull();
|
||||
|
@ -836,22 +836,40 @@ bool Item_string::eq(const Item *item, bool binary_cmp) const
|
|||
|
||||
|
||||
/*
|
||||
Get the value of the function as a TIME structure.
|
||||
Get the value of the function as a MYSQL_TIME structure.
|
||||
As a extra convenience the time structure is reset on error!
|
||||
*/
|
||||
|
||||
bool Item::get_date(TIME *ltime,uint fuzzydate)
|
||||
bool Item::get_date(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
|
||||
if (!(res=val_str(&tmp)) ||
|
||||
str_to_datetime_with_warn(res->ptr(), res->length(),
|
||||
ltime, fuzzydate) <= MYSQL_TIMESTAMP_ERROR)
|
||||
if (result_type() == STRING_RESULT)
|
||||
{
|
||||
bzero((char*) ltime,sizeof(*ltime));
|
||||
return 1;
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff), &my_charset_bin),*res;
|
||||
if (!(res=val_str(&tmp)) ||
|
||||
str_to_datetime_with_warn(res->ptr(), res->length(),
|
||||
ltime, fuzzydate) <= MYSQL_TIMESTAMP_ERROR)
|
||||
goto err;
|
||||
}
|
||||
else
|
||||
{
|
||||
longlong value= val_int();
|
||||
int was_cut;
|
||||
if (number_to_datetime(value, ltime, fuzzydate, &was_cut) == LL(-1))
|
||||
{
|
||||
char buff[22], *end;
|
||||
end= longlong10_to_str(value, buff, -10);
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
buff, (int) (end-buff), MYSQL_TIMESTAMP_NONE,
|
||||
NullS);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
err:
|
||||
bzero((char*) ltime,sizeof(*ltime));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -859,7 +877,7 @@ bool Item::get_date(TIME *ltime,uint fuzzydate)
|
|||
As a extra convenience the time structure is reset on error!
|
||||
*/
|
||||
|
||||
bool Item::get_time(TIME *ltime)
|
||||
bool Item::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
char buff[40];
|
||||
String tmp(buff,sizeof(buff),&my_charset_bin),*res;
|
||||
|
@ -1837,7 +1855,7 @@ String *Item_field::str_result(String *str)
|
|||
return result_field->val_str(str,&str_value);
|
||||
}
|
||||
|
||||
bool Item_field::get_date(TIME *ltime,uint fuzzydate)
|
||||
bool Item_field::get_date(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
if ((null_value=field->is_null()) || field->get_date(ltime,fuzzydate))
|
||||
{
|
||||
|
@ -1847,7 +1865,7 @@ bool Item_field::get_date(TIME *ltime,uint fuzzydate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool Item_field::get_date_result(TIME *ltime,uint fuzzydate)
|
||||
bool Item_field::get_date_result(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
if ((null_value=result_field->is_null()) ||
|
||||
result_field->get_date(ltime,fuzzydate))
|
||||
|
@ -1858,7 +1876,7 @@ bool Item_field::get_date_result(TIME *ltime,uint fuzzydate)
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool Item_field::get_time(TIME *ltime)
|
||||
bool Item_field::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
if ((null_value=field->is_null()) || field->get_time(ltime))
|
||||
{
|
||||
|
@ -2385,7 +2403,7 @@ void Item_param::set_decimal(const char *str, ulong length)
|
|||
|
||||
|
||||
/*
|
||||
Set parameter value from TIME value.
|
||||
Set parameter value from MYSQL_TIME value.
|
||||
|
||||
SYNOPSIS
|
||||
set_time()
|
||||
|
@ -2399,7 +2417,7 @@ void Item_param::set_decimal(const char *str, ulong length)
|
|||
the fact that even wrong value sent over binary protocol fits into
|
||||
MAX_DATE_STRING_REP_LENGTH buffer.
|
||||
*/
|
||||
void Item_param::set_time(TIME *tm, timestamp_type time_type,
|
||||
void Item_param::set_time(MYSQL_TIME *tm, timestamp_type time_type,
|
||||
uint32 max_length_arg)
|
||||
{
|
||||
DBUG_ENTER("Item_param::set_time");
|
||||
|
@ -2414,7 +2432,8 @@ void Item_param::set_time(TIME *tm, timestamp_type time_type,
|
|||
{
|
||||
char buff[MAX_DATE_STRING_REP_LENGTH];
|
||||
uint length= my_TIME_to_str(&value.time, buff);
|
||||
make_truncated_value_warning(current_thd, buff, length, time_type, 0);
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
buff, length, time_type, 0);
|
||||
set_zero_time(&value.time, MYSQL_TIMESTAMP_ERROR);
|
||||
}
|
||||
|
||||
|
@ -2615,7 +2634,7 @@ int Item_param::save_in_field(Field *field, bool no_conversions)
|
|||
}
|
||||
|
||||
|
||||
bool Item_param::get_time(TIME *res)
|
||||
bool Item_param::get_time(MYSQL_TIME *res)
|
||||
{
|
||||
if (state == TIME_VALUE)
|
||||
{
|
||||
|
@ -2630,7 +2649,7 @@ bool Item_param::get_time(TIME *res)
|
|||
}
|
||||
|
||||
|
||||
bool Item_param::get_date(TIME *res, uint fuzzydate)
|
||||
bool Item_param::get_date(MYSQL_TIME *res, uint fuzzydate)
|
||||
{
|
||||
if (state == TIME_VALUE)
|
||||
{
|
||||
|
@ -3056,7 +3075,7 @@ String* Item_ref_null_helper::val_str(String* s)
|
|||
}
|
||||
|
||||
|
||||
bool Item_ref_null_helper::get_date(TIME *ltime, uint fuzzydate)
|
||||
bool Item_ref_null_helper::get_date(MYSQL_TIME *ltime, uint fuzzydate)
|
||||
{
|
||||
return (owner->was_null|= null_value= (*ref)->get_date(ltime, fuzzydate));
|
||||
}
|
||||
|
@ -4852,7 +4871,7 @@ bool Item::send(Protocol *protocol, String *buffer)
|
|||
case MYSQL_TYPE_DATE:
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
{
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
get_date(&tm, TIME_FUZZY_DATE);
|
||||
if (!null_value)
|
||||
{
|
||||
|
@ -4865,7 +4884,7 @@ bool Item::send(Protocol *protocol, String *buffer)
|
|||
}
|
||||
case MYSQL_TYPE_TIME:
|
||||
{
|
||||
TIME tm;
|
||||
MYSQL_TIME tm;
|
||||
get_time(&tm);
|
||||
if (!null_value)
|
||||
result= protocol->store_time(&tm);
|
||||
|
@ -5437,7 +5456,7 @@ bool Item_ref::is_null()
|
|||
}
|
||||
|
||||
|
||||
bool Item_ref::get_date(TIME *ltime,uint fuzzydate)
|
||||
bool Item_ref::get_date(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
return (null_value=(*ref)->get_date_result(ltime,fuzzydate));
|
||||
}
|
||||
|
@ -5536,7 +5555,7 @@ bool Item_direct_ref::is_null()
|
|||
}
|
||||
|
||||
|
||||
bool Item_direct_ref::get_date(TIME *ltime,uint fuzzydate)
|
||||
bool Item_direct_ref::get_date(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{
|
||||
return (null_value=(*ref)->get_date(ltime,fuzzydate));
|
||||
}
|
||||
|
|
26
sql/item.h
26
sql/item.h
|
@ -689,9 +689,9 @@ public:
|
|||
/* Called for items that really have to be split */
|
||||
void split_sum_func2(THD *thd, Item **ref_pointer_array, List<Item> &fields,
|
||||
Item **ref, bool skip_registered);
|
||||
virtual bool get_date(TIME *ltime,uint fuzzydate);
|
||||
virtual bool get_time(TIME *ltime);
|
||||
virtual bool get_date_result(TIME *ltime,uint fuzzydate)
|
||||
virtual bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
virtual bool get_time(MYSQL_TIME *ltime);
|
||||
virtual bool get_date_result(MYSQL_TIME *ltime,uint fuzzydate)
|
||||
{ return get_date(ltime,fuzzydate); }
|
||||
/*
|
||||
The method allows to determine nullness of a complex expression
|
||||
|
@ -1272,9 +1272,9 @@ public:
|
|||
}
|
||||
Field *get_tmp_table_field() { return result_field; }
|
||||
Field *tmp_table_field(TABLE *t_arg) { return result_field; }
|
||||
bool get_date(TIME *ltime,uint fuzzydate);
|
||||
bool get_date_result(TIME *ltime,uint fuzzydate);
|
||||
bool get_time(TIME *ltime);
|
||||
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
bool get_date_result(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
bool get_time(MYSQL_TIME *ltime);
|
||||
bool is_null() { return field->is_null(); }
|
||||
void update_null_value();
|
||||
Item *get_tmp_table_item(THD *thd);
|
||||
|
@ -1401,7 +1401,7 @@ public:
|
|||
*/
|
||||
CHARSET_INFO *final_character_set_of_str_value;
|
||||
} cs_info;
|
||||
TIME time;
|
||||
MYSQL_TIME time;
|
||||
} value;
|
||||
|
||||
/* Cached values for virtual methods to save us one switch. */
|
||||
|
@ -1433,8 +1433,8 @@ public:
|
|||
longlong val_int();
|
||||
my_decimal *val_decimal(my_decimal*);
|
||||
String *val_str(String*);
|
||||
bool get_time(TIME *tm);
|
||||
bool get_date(TIME *tm, uint fuzzydate);
|
||||
bool get_time(MYSQL_TIME *tm);
|
||||
bool get_date(MYSQL_TIME *tm, uint fuzzydate);
|
||||
int save_in_field(Field *field, bool no_conversions);
|
||||
|
||||
void set_null();
|
||||
|
@ -1443,7 +1443,7 @@ public:
|
|||
void set_decimal(const char *str, ulong length);
|
||||
bool set_str(const char *str, ulong length);
|
||||
bool set_longdata(const char *str, ulong length);
|
||||
void set_time(TIME *tm, timestamp_type type, uint32 max_length_arg);
|
||||
void set_time(MYSQL_TIME *tm, timestamp_type type, uint32 max_length_arg);
|
||||
bool set_from_user_var(THD *thd, const user_var_entry *entry);
|
||||
void reset();
|
||||
/*
|
||||
|
@ -1876,7 +1876,7 @@ public:
|
|||
bool val_bool();
|
||||
String *val_str(String* tmp);
|
||||
bool is_null();
|
||||
bool get_date(TIME *ltime,uint fuzzydate);
|
||||
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
double val_result();
|
||||
longlong val_int_result();
|
||||
String *str_result(String* tmp);
|
||||
|
@ -1953,7 +1953,7 @@ public:
|
|||
my_decimal *val_decimal(my_decimal *);
|
||||
bool val_bool();
|
||||
bool is_null();
|
||||
bool get_date(TIME *ltime,uint fuzzydate);
|
||||
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
|
||||
virtual Ref_Type ref_type() { return DIRECT_REF; }
|
||||
};
|
||||
|
||||
|
@ -2058,7 +2058,7 @@ public:
|
|||
String* val_str(String* s);
|
||||
my_decimal *val_decimal(my_decimal *);
|
||||
bool val_bool();
|
||||
bool get_date(TIME *ltime, uint fuzzydate);
|
||||
bool get_date(MYSQL_TIME *ltime, uint fuzzydate);
|
||||
void print(String *str);
|
||||
/*
|
||||
we add RAND_TABLE_BIT to prevent moving this item from HAVING to WHERE
|
||||
|
|
|
@ -316,8 +316,10 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item)
|
|||
{
|
||||
/* For comparison purposes allow invalid dates like 2000-01-32 */
|
||||
ulong orig_sql_mode= thd->variables.sql_mode;
|
||||
enum_check_fields orig_count_cuted_fields= thd->count_cuted_fields;
|
||||
thd->variables.sql_mode= (orig_sql_mode & ~MODE_NO_ZERO_DATE) |
|
||||
MODE_INVALID_DATES;
|
||||
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
|
||||
if (!(*item)->save_in_field(field, 1) && !((*item)->null_value))
|
||||
{
|
||||
Item *tmp=new Item_int_with_ref(field->val_int(), *item,
|
||||
|
@ -328,6 +330,7 @@ static bool convert_constant_item(THD *thd, Field *field, Item **item)
|
|||
return 1; // Item was replaced
|
||||
}
|
||||
thd->variables.sql_mode= orig_sql_mode;
|
||||
thd->count_cuted_fields= orig_count_cuted_fields;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -564,8 +567,9 @@ get_date_from_str(THD *thd, String *str, timestamp_type warn_type,
|
|||
|
||||
if (error || *error_arg)
|
||||
{
|
||||
make_truncated_value_warning(thd, str->ptr(), str->length(), warn_type,
|
||||
warn_name);
|
||||
make_truncated_value_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
str->ptr(), str->length(),
|
||||
warn_type, warn_name);
|
||||
*error_arg= TRUE;
|
||||
}
|
||||
return value;
|
||||
|
|
|
@ -147,11 +147,11 @@ public:
|
|||
void count_only_length();
|
||||
void count_real_length();
|
||||
void count_decimal_length();
|
||||
inline bool get_arg0_date(TIME *ltime, uint fuzzy_date)
|
||||
inline bool get_arg0_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
return (null_value=args[0]->get_date(ltime, fuzzy_date));
|
||||
}
|
||||
inline bool get_arg0_time(TIME *ltime)
|
||||
inline bool get_arg0_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
return (null_value=args[0]->get_time(ltime));
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
the microseconds twice.
|
||||
*/
|
||||
|
||||
static bool make_datetime(date_time_format_types format, TIME *ltime,
|
||||
static bool make_datetime(date_time_format_types format, MYSQL_TIME *ltime,
|
||||
String *str)
|
||||
{
|
||||
char *buff;
|
||||
|
@ -95,7 +95,7 @@ static bool make_datetime(date_time_format_types format, TIME *ltime,
|
|||
|
||||
|
||||
/*
|
||||
Wrapper over make_datetime() with validation of the input TIME value
|
||||
Wrapper over make_datetime() with validation of the input MYSQL_TIME value
|
||||
|
||||
NOTE
|
||||
see make_datetime() for more information
|
||||
|
@ -105,7 +105,7 @@ static bool make_datetime(date_time_format_types format, TIME *ltime,
|
|||
0 otherwise
|
||||
*/
|
||||
|
||||
static bool make_datetime_with_warn(date_time_format_types format, TIME *ltime,
|
||||
static bool make_datetime_with_warn(date_time_format_types format, MYSQL_TIME *ltime,
|
||||
String *str)
|
||||
{
|
||||
int warning= 0;
|
||||
|
@ -117,14 +117,15 @@ static bool make_datetime_with_warn(date_time_format_types format, TIME *ltime,
|
|||
if (!warning)
|
||||
return 0;
|
||||
|
||||
make_truncated_value_warning(current_thd, str->ptr(), str->length(),
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
str->ptr(), str->length(),
|
||||
MYSQL_TIMESTAMP_TIME, NullS);
|
||||
return make_datetime(format, ltime, str);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Wrapper over make_time() with validation of the input TIME value
|
||||
Wrapper over make_time() with validation of the input MYSQL_TIME value
|
||||
|
||||
NOTE
|
||||
see make_time() for more info
|
||||
|
@ -135,7 +136,7 @@ static bool make_datetime_with_warn(date_time_format_types format, TIME *ltime,
|
|||
*/
|
||||
|
||||
static bool make_time_with_warn(const DATE_TIME_FORMAT *format,
|
||||
TIME *l_time, String *str)
|
||||
MYSQL_TIME *l_time, String *str)
|
||||
{
|
||||
int warning= 0;
|
||||
make_time(format, l_time, str);
|
||||
|
@ -143,7 +144,8 @@ static bool make_time_with_warn(const DATE_TIME_FORMAT *format,
|
|||
return 1;
|
||||
if (warning)
|
||||
{
|
||||
make_truncated_value_warning(current_thd, str->ptr(), str->length(),
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
str->ptr(), str->length(),
|
||||
MYSQL_TIMESTAMP_TIME, NullS);
|
||||
make_time(format, l_time, str);
|
||||
}
|
||||
|
@ -153,16 +155,16 @@ static bool make_time_with_warn(const DATE_TIME_FORMAT *format,
|
|||
|
||||
|
||||
/*
|
||||
Convert seconds to TIME value with overflow checking
|
||||
Convert seconds to MYSQL_TIME value with overflow checking
|
||||
|
||||
SYNOPSIS:
|
||||
sec_to_time()
|
||||
seconds number of seconds
|
||||
unsigned_flag 1, if 'seconds' is unsigned, 0, otherwise
|
||||
ltime output TIME value
|
||||
ltime output MYSQL_TIME value
|
||||
|
||||
DESCRIPTION
|
||||
If the 'seconds' argument is inside TIME data range, convert it to a
|
||||
If the 'seconds' argument is inside MYSQL_TIME data range, convert it to a
|
||||
corresponding value.
|
||||
Otherwise, truncate the resulting value to the nearest endpoint, and
|
||||
produce a warning message.
|
||||
|
@ -172,7 +174,7 @@ static bool make_time_with_warn(const DATE_TIME_FORMAT *format,
|
|||
0 otherwise
|
||||
*/
|
||||
|
||||
static bool sec_to_time(longlong seconds, bool unsigned_flag, TIME *ltime)
|
||||
static bool sec_to_time(longlong seconds, bool unsigned_flag, MYSQL_TIME *ltime)
|
||||
{
|
||||
uint sec;
|
||||
|
||||
|
@ -205,7 +207,8 @@ overflow:
|
|||
char buf[22];
|
||||
int len= (int)(longlong10_to_str(seconds, buf, unsigned_flag ? 10 : -10)
|
||||
- buf);
|
||||
make_truncated_value_warning(current_thd, buf, len, MYSQL_TIMESTAMP_TIME,
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
buf, len, MYSQL_TIMESTAMP_TIME,
|
||||
NullS);
|
||||
|
||||
return 1;
|
||||
|
@ -224,7 +227,7 @@ static DATE_TIME_FORMAT time_24hrs_format= {{0}, '\0', 0,
|
|||
{(char *)"%H:%i:%S", 8}};
|
||||
|
||||
/*
|
||||
Extract datetime value to TIME struct from string value
|
||||
Extract datetime value to MYSQL_TIME struct from string value
|
||||
according to format string.
|
||||
|
||||
SYNOPSIS
|
||||
|
@ -257,7 +260,7 @@ static DATE_TIME_FORMAT time_24hrs_format= {{0}, '\0', 0,
|
|||
*/
|
||||
|
||||
static bool extract_date_time(DATE_TIME_FORMAT *format,
|
||||
const char *val, uint length, TIME *l_time,
|
||||
const char *val, uint length, MYSQL_TIME *l_time,
|
||||
timestamp_type cached_timestamp_type,
|
||||
const char **sub_pattern_end,
|
||||
const char *date_time_type)
|
||||
|
@ -305,13 +308,15 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||
case 'Y':
|
||||
tmp= (char*) val + min(4, val_len);
|
||||
l_time->year= (int) my_strtoll10(val, &tmp, &error);
|
||||
if ((int) (tmp-val) <= 2)
|
||||
l_time->year= year_2000_handling(l_time->year);
|
||||
val= tmp;
|
||||
break;
|
||||
case 'y':
|
||||
tmp= (char*) val + min(2, val_len);
|
||||
l_time->year= (int) my_strtoll10(val, &tmp, &error);
|
||||
val= tmp;
|
||||
l_time->year+= (l_time->year < YY_PART_YEAR ? 2000 : 1900);
|
||||
l_time->year= year_2000_handling(l_time->year);
|
||||
break;
|
||||
|
||||
/* Month */
|
||||
|
@ -514,7 +519,8 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||
|
||||
if (yearday > 0)
|
||||
{
|
||||
uint days= calc_daynr(l_time->year,1,1) + yearday - 1;
|
||||
uint days;
|
||||
days= calc_daynr(l_time->year,1,1) + yearday - 1;
|
||||
if (days <= 0 || days > MAX_DAY_NUMBER)
|
||||
goto err;
|
||||
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
||||
|
@ -576,7 +582,8 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
|||
{
|
||||
if (!my_isspace(&my_charset_latin1,*val))
|
||||
{
|
||||
make_truncated_value_warning(current_thd, val_begin, length,
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
val_begin, length,
|
||||
cached_timestamp_type, NullS);
|
||||
break;
|
||||
}
|
||||
|
@ -600,7 +607,7 @@ err:
|
|||
Create a formated date/time value in a string
|
||||
*/
|
||||
|
||||
bool make_date_time(DATE_TIME_FORMAT *format, TIME *l_time,
|
||||
bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time,
|
||||
timestamp_type type, String *str)
|
||||
{
|
||||
char intbuff[15];
|
||||
|
@ -915,8 +922,8 @@ static bool get_interval_info(const char *str,uint length,CHARSET_INFO *cs,
|
|||
|
||||
*/
|
||||
|
||||
static bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign,
|
||||
longlong *seconds_out, long *microseconds_out)
|
||||
bool calc_time_diff(MYSQL_TIME *l_time1, MYSQL_TIME *l_time2, int l_sign,
|
||||
longlong *seconds_out, long *microseconds_out)
|
||||
{
|
||||
long days;
|
||||
bool neg;
|
||||
|
@ -996,7 +1003,7 @@ longlong Item_func_period_diff::val_int()
|
|||
longlong Item_func_to_days::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_arg0_date(<ime, TIME_NO_ZERO_DATE))
|
||||
return 0;
|
||||
return (longlong) calc_daynr(ltime.year,ltime.month,ltime.day);
|
||||
|
@ -1005,7 +1012,7 @@ longlong Item_func_to_days::val_int()
|
|||
longlong Item_func_dayofyear::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_arg0_date(<ime,TIME_NO_ZERO_DATE))
|
||||
return 0;
|
||||
return (longlong) calc_daynr(ltime.year,ltime.month,ltime.day) -
|
||||
|
@ -1015,7 +1022,7 @@ longlong Item_func_dayofyear::val_int()
|
|||
longlong Item_func_dayofmonth::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
(void) get_arg0_date(<ime, TIME_FUZZY_DATE);
|
||||
return (longlong) ltime.day;
|
||||
}
|
||||
|
@ -1023,7 +1030,7 @@ longlong Item_func_dayofmonth::val_int()
|
|||
longlong Item_func_month::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
(void) get_arg0_date(<ime, TIME_FUZZY_DATE);
|
||||
return (longlong) ltime.month;
|
||||
}
|
||||
|
@ -1053,7 +1060,7 @@ String* Item_func_monthname::val_str(String* str)
|
|||
longlong Item_func_quarter::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_arg0_date(<ime, TIME_FUZZY_DATE))
|
||||
return 0;
|
||||
return (longlong) ((ltime.month+2)/3);
|
||||
|
@ -1062,7 +1069,7 @@ longlong Item_func_quarter::val_int()
|
|||
longlong Item_func_hour::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
(void) get_arg0_time(<ime);
|
||||
return ltime.hour;
|
||||
}
|
||||
|
@ -1070,7 +1077,7 @@ longlong Item_func_hour::val_int()
|
|||
longlong Item_func_minute::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
(void) get_arg0_time(<ime);
|
||||
return ltime.minute;
|
||||
}
|
||||
|
@ -1079,7 +1086,7 @@ longlong Item_func_minute::val_int()
|
|||
longlong Item_func_second::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
(void) get_arg0_time(<ime);
|
||||
return ltime.second;
|
||||
}
|
||||
|
@ -1126,7 +1133,7 @@ longlong Item_func_week::val_int()
|
|||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
uint year;
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_arg0_date(<ime, TIME_NO_ZERO_DATE))
|
||||
return 0;
|
||||
return (longlong) calc_week(<ime,
|
||||
|
@ -1139,7 +1146,7 @@ longlong Item_func_yearweek::val_int()
|
|||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
uint year,week;
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_arg0_date(<ime, TIME_NO_ZERO_DATE))
|
||||
return 0;
|
||||
week= calc_week(<ime,
|
||||
|
@ -1152,7 +1159,7 @@ longlong Item_func_yearweek::val_int()
|
|||
longlong Item_func_weekday::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
if (get_arg0_date(<ime, TIME_NO_ZERO_DATE))
|
||||
return 0;
|
||||
|
@ -1182,7 +1189,7 @@ String* Item_func_dayname::val_str(String* str)
|
|||
longlong Item_func_year::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
(void) get_arg0_date(<ime, TIME_FUZZY_DATE);
|
||||
return (longlong) ltime.year;
|
||||
}
|
||||
|
@ -1190,7 +1197,7 @@ longlong Item_func_year::val_int()
|
|||
|
||||
longlong Item_func_unix_timestamp::val_int()
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
my_bool not_used;
|
||||
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
@ -1221,7 +1228,7 @@ longlong Item_func_unix_timestamp::val_int()
|
|||
longlong Item_func_time_to_sec::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
longlong seconds;
|
||||
(void) get_arg0_time(<ime);
|
||||
seconds=ltime.hour*3600L+ltime.minute*60+ltime.second;
|
||||
|
@ -1390,7 +1397,7 @@ static bool get_interval_value(Item *args,interval_type int_type,
|
|||
String *Item_date::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||
return (String *) 0;
|
||||
if (str->alloc(11))
|
||||
|
@ -1406,19 +1413,19 @@ String *Item_date::val_str(String *str)
|
|||
longlong Item_date::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||
return 0;
|
||||
return (longlong) (ltime.year*10000L+ltime.month*100+ltime.day);
|
||||
}
|
||||
|
||||
|
||||
bool Item_func_from_days::get_date(TIME *ltime, uint fuzzy_date)
|
||||
bool Item_func_from_days::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
longlong value=args[0]->val_int();
|
||||
if ((null_value=args[0]->null_value))
|
||||
return 1;
|
||||
bzero(ltime, sizeof(TIME));
|
||||
bzero(ltime, sizeof(MYSQL_TIME));
|
||||
get_date_from_daynr((long) value, <ime->year, <ime->month, <ime->day);
|
||||
ltime->time_type= MYSQL_TIMESTAMP_DATE;
|
||||
return 0;
|
||||
|
@ -1452,10 +1459,10 @@ String *Item_func_curdate::val_str(String *str)
|
|||
}
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for local
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for local
|
||||
time zone. Defines time zone (local) used for whole CURDATE function.
|
||||
*/
|
||||
void Item_func_curdate_local::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_curdate_local::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
thd->variables.time_zone->gmt_sec_to_TIME(now_time,
|
||||
|
@ -1465,10 +1472,10 @@ void Item_func_curdate_local::store_now_in_TIME(TIME *now_time)
|
|||
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for UTC
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for UTC
|
||||
time zone. Defines time zone (UTC) used for whole UTC_DATE function.
|
||||
*/
|
||||
void Item_func_curdate_utc::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_curdate_utc::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
my_tz_UTC->gmt_sec_to_TIME(now_time,
|
||||
(my_time_t)(current_thd->query_start()));
|
||||
|
@ -1479,7 +1486,7 @@ void Item_func_curdate_utc::store_now_in_TIME(TIME *now_time)
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_curdate::get_date(TIME *res,
|
||||
bool Item_func_curdate::get_date(MYSQL_TIME *res,
|
||||
uint fuzzy_date __attribute__((unused)))
|
||||
{
|
||||
*res=ltime;
|
||||
|
@ -1497,7 +1504,7 @@ String *Item_func_curtime::val_str(String *str)
|
|||
|
||||
void Item_func_curtime::fix_length_and_dec()
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
decimals= DATETIME_DEC;
|
||||
collation.set(&my_charset_bin);
|
||||
|
@ -1509,10 +1516,10 @@ void Item_func_curtime::fix_length_and_dec()
|
|||
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for local
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for local
|
||||
time zone. Defines time zone (local) used for whole CURTIME function.
|
||||
*/
|
||||
void Item_func_curtime_local::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_curtime_local::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
thd->variables.time_zone->gmt_sec_to_TIME(now_time,
|
||||
|
@ -1522,10 +1529,10 @@ void Item_func_curtime_local::store_now_in_TIME(TIME *now_time)
|
|||
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for UTC
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for UTC
|
||||
time zone. Defines time zone (UTC) used for whole UTC_TIME function.
|
||||
*/
|
||||
void Item_func_curtime_utc::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_curtime_utc::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
my_tz_UTC->gmt_sec_to_TIME(now_time,
|
||||
(my_time_t)(current_thd->query_start()));
|
||||
|
@ -1558,10 +1565,10 @@ void Item_func_now::fix_length_and_dec()
|
|||
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for local
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for local
|
||||
time zone. Defines time zone (local) used for whole NOW function.
|
||||
*/
|
||||
void Item_func_now_local::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_now_local::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
thd->variables.time_zone->gmt_sec_to_TIME(now_time,
|
||||
|
@ -1571,10 +1578,10 @@ void Item_func_now_local::store_now_in_TIME(TIME *now_time)
|
|||
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for UTC
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for UTC
|
||||
time zone. Defines time zone (UTC) used for whole UTC_TIMESTAMP function.
|
||||
*/
|
||||
void Item_func_now_utc::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_now_utc::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
my_tz_UTC->gmt_sec_to_TIME(now_time,
|
||||
(my_time_t)(current_thd->query_start()));
|
||||
|
@ -1585,7 +1592,7 @@ void Item_func_now_utc::store_now_in_TIME(TIME *now_time)
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_now::get_date(TIME *res,
|
||||
bool Item_func_now::get_date(MYSQL_TIME *res,
|
||||
uint fuzzy_date __attribute__((unused)))
|
||||
{
|
||||
*res= ltime;
|
||||
|
@ -1602,10 +1609,10 @@ int Item_func_now::save_in_field(Field *to, bool no_conversions)
|
|||
|
||||
|
||||
/*
|
||||
Converts current time in my_time_t to TIME represenatation for local
|
||||
Converts current time in my_time_t to MYSQL_TIME represenatation for local
|
||||
time zone. Defines time zone (local) used for whole SYSDATE function.
|
||||
*/
|
||||
void Item_func_sysdate_local::store_now_in_TIME(TIME *now_time)
|
||||
void Item_func_sysdate_local::store_now_in_TIME(MYSQL_TIME *now_time)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
thd->variables.time_zone->gmt_sec_to_TIME(now_time, (my_time_t) time(NULL));
|
||||
|
@ -1647,7 +1654,7 @@ void Item_func_sysdate_local::fix_length_and_dec()
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_sysdate_local::get_date(TIME *res,
|
||||
bool Item_func_sysdate_local::get_date(MYSQL_TIME *res,
|
||||
uint fuzzy_date __attribute__((unused)))
|
||||
{
|
||||
store_now_in_TIME(<ime);
|
||||
|
@ -1668,7 +1675,7 @@ int Item_func_sysdate_local::save_in_field(Field *to, bool no_conversions)
|
|||
String *Item_func_sec_to_time::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
longlong arg_val= args[0]->val_int();
|
||||
|
||||
if ((null_value=args[0]->null_value) || str->alloc(19))
|
||||
|
@ -1687,7 +1694,7 @@ String *Item_func_sec_to_time::val_str(String *str)
|
|||
longlong Item_func_sec_to_time::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
longlong arg_val= args[0]->val_int();
|
||||
|
||||
if ((null_value=args[0]->null_value))
|
||||
|
@ -1829,7 +1836,7 @@ uint Item_func_date_format::format_length(const String *format)
|
|||
String *Item_func_date_format::val_str(String *str)
|
||||
{
|
||||
String *format;
|
||||
TIME l_time;
|
||||
MYSQL_TIME l_time;
|
||||
uint size;
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
||||
|
@ -1892,7 +1899,7 @@ void Item_func_from_unixtime::fix_length_and_dec()
|
|||
|
||||
String *Item_func_from_unixtime::val_str(String *str)
|
||||
{
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
||||
|
@ -1912,7 +1919,7 @@ String *Item_func_from_unixtime::val_str(String *str)
|
|||
|
||||
longlong Item_func_from_unixtime::val_int()
|
||||
{
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
||||
|
@ -1922,7 +1929,7 @@ longlong Item_func_from_unixtime::val_int()
|
|||
return (longlong) TIME_to_ulonglong_datetime(&time_tmp);
|
||||
}
|
||||
|
||||
bool Item_func_from_unixtime::get_date(TIME *ltime,
|
||||
bool Item_func_from_unixtime::get_date(MYSQL_TIME *ltime,
|
||||
uint fuzzy_date __attribute__((unused)))
|
||||
{
|
||||
ulonglong tmp= (ulonglong)(args[0]->val_int());
|
||||
|
@ -1963,7 +1970,7 @@ Item_func_convert_tz::fix_fields(THD *thd_arg, Item **ref)
|
|||
|
||||
String *Item_func_convert_tz::val_str(String *str)
|
||||
{
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
|
||||
if (get_date(&time_tmp, 0))
|
||||
return 0;
|
||||
|
@ -1981,7 +1988,7 @@ String *Item_func_convert_tz::val_str(String *str)
|
|||
|
||||
longlong Item_func_convert_tz::val_int()
|
||||
{
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
|
||||
if (get_date(&time_tmp, 0))
|
||||
return 0;
|
||||
|
@ -1990,7 +1997,7 @@ longlong Item_func_convert_tz::val_int()
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_convert_tz::get_date(TIME *ltime,
|
||||
bool Item_func_convert_tz::get_date(MYSQL_TIME *ltime,
|
||||
uint fuzzy_date __attribute__((unused)))
|
||||
{
|
||||
my_time_t my_time_tmp;
|
||||
|
@ -2051,7 +2058,7 @@ void Item_date_add_interval::fix_length_and_dec()
|
|||
- If first arg is a MYSQL_TYPE_DATE and the interval type uses hours,
|
||||
minutes or seconds then type is MYSQL_TYPE_DATETIME.
|
||||
- Otherwise the result is MYSQL_TYPE_STRING
|
||||
(This is because you can't know if the string contains a DATE, TIME or
|
||||
(This is because you can't know if the string contains a DATE, MYSQL_TIME or
|
||||
DATETIME argument)
|
||||
*/
|
||||
cached_field_type= MYSQL_TYPE_STRING;
|
||||
|
@ -2071,7 +2078,7 @@ void Item_date_add_interval::fix_length_and_dec()
|
|||
|
||||
/* Here arg[1] is a Item_interval object */
|
||||
|
||||
bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
||||
bool Item_date_add_interval::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
long period,sign;
|
||||
INTERVAL interval;
|
||||
|
@ -2209,7 +2216,7 @@ invalid_date:
|
|||
String *Item_date_add_interval::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
enum date_time_format_types format;
|
||||
|
||||
if (Item_date_add_interval::get_date(<ime, TIME_NO_ZERO_DATE))
|
||||
|
@ -2233,7 +2240,7 @@ String *Item_date_add_interval::val_str(String *str)
|
|||
longlong Item_date_add_interval::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
longlong date;
|
||||
if (Item_date_add_interval::get_date(<ime, TIME_NO_ZERO_DATE))
|
||||
return (longlong) 0;
|
||||
|
@ -2322,7 +2329,7 @@ void Item_extract::fix_length_and_dec()
|
|||
longlong Item_extract::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
uint year;
|
||||
ulong week_format;
|
||||
long neg;
|
||||
|
@ -2574,7 +2581,7 @@ void Item_char_typecast::fix_length_and_dec()
|
|||
String *Item_datetime_typecast::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (!get_arg0_date(<ime, TIME_FUZZY_DATE) &&
|
||||
!make_datetime(ltime.second_part ? DATE_TIME_MICROSECOND : DATE_TIME,
|
||||
<ime, str))
|
||||
|
@ -2588,7 +2595,7 @@ String *Item_datetime_typecast::val_str(String *str)
|
|||
longlong Item_datetime_typecast::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_arg0_date(<ime,1))
|
||||
{
|
||||
null_value= 1;
|
||||
|
@ -2599,7 +2606,7 @@ longlong Item_datetime_typecast::val_int()
|
|||
}
|
||||
|
||||
|
||||
bool Item_time_typecast::get_time(TIME *ltime)
|
||||
bool Item_time_typecast::get_time(MYSQL_TIME *ltime)
|
||||
{
|
||||
bool res= get_arg0_time(ltime);
|
||||
/*
|
||||
|
@ -2615,7 +2622,7 @@ bool Item_time_typecast::get_time(TIME *ltime)
|
|||
|
||||
longlong Item_time_typecast::val_int()
|
||||
{
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (get_time(<ime))
|
||||
{
|
||||
null_value= 1;
|
||||
|
@ -2627,7 +2634,7 @@ longlong Item_time_typecast::val_int()
|
|||
String *Item_time_typecast::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
if (!get_arg0_time(<ime) &&
|
||||
!make_datetime(ltime.second_part ? TIME_MICROSECOND : TIME_ONLY,
|
||||
|
@ -2639,7 +2646,7 @@ String *Item_time_typecast::val_str(String *str)
|
|||
}
|
||||
|
||||
|
||||
bool Item_date_typecast::get_date(TIME *ltime, uint fuzzy_date)
|
||||
bool Item_date_typecast::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
bool res= get_arg0_date(ltime, TIME_FUZZY_DATE);
|
||||
ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0;
|
||||
|
@ -2651,7 +2658,7 @@ bool Item_date_typecast::get_date(TIME *ltime, uint fuzzy_date)
|
|||
String *Item_date_typecast::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
if (!get_arg0_date(<ime, TIME_FUZZY_DATE) && !str->alloc(11))
|
||||
{
|
||||
|
@ -2666,7 +2673,7 @@ String *Item_date_typecast::val_str(String *str)
|
|||
longlong Item_date_typecast::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (args[0]->get_date(<ime, TIME_FUZZY_DATE))
|
||||
{
|
||||
null_value= 1;
|
||||
|
@ -2678,21 +2685,29 @@ longlong Item_date_typecast::val_int()
|
|||
/*
|
||||
MAKEDATE(a,b) is a date function that creates a date value
|
||||
from a year and day value.
|
||||
|
||||
NOTES:
|
||||
As arguments are integers, we can't know if the year is a 2 digit or 4 digit year.
|
||||
In this case we treat all years < 100 as 2 digit years. Ie, this is not safe
|
||||
for dates between 0000-01-01 and 0099-12-31
|
||||
*/
|
||||
|
||||
String *Item_func_makedate::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME l_time;
|
||||
MYSQL_TIME l_time;
|
||||
long daynr= (long) args[1]->val_int();
|
||||
long yearnr= (long) args[0]->val_int();
|
||||
long year= (long) args[0]->val_int();
|
||||
long days;
|
||||
|
||||
if (args[0]->null_value || args[1]->null_value ||
|
||||
yearnr < 0 || daynr <= 0)
|
||||
year < 0 || daynr <= 0)
|
||||
goto err;
|
||||
|
||||
days= calc_daynr(yearnr,1,1) + daynr - 1;
|
||||
if (year < 100)
|
||||
year= year_2000_handling(year);
|
||||
|
||||
days= calc_daynr(year,1,1) + daynr - 1;
|
||||
/* Day number from year 0 to 9999-12-31 */
|
||||
if (days >= 0 && days <= MAX_DAY_NUMBER)
|
||||
{
|
||||
|
@ -2710,19 +2725,32 @@ err:
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
MAKEDATE(a,b) is a date function that creates a date value
|
||||
from a year and day value.
|
||||
|
||||
NOTES:
|
||||
As arguments are integers, we can't know if the year is a 2 digit or 4 digit year.
|
||||
In this case we treat all years < 100 as 2 digit years. Ie, this is not safe
|
||||
for dates between 0000-01-01 and 0099-12-31
|
||||
*/
|
||||
|
||||
longlong Item_func_makedate::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME l_time;
|
||||
MYSQL_TIME l_time;
|
||||
long daynr= (long) args[1]->val_int();
|
||||
long yearnr= (long) args[0]->val_int();
|
||||
long year= (long) args[0]->val_int();
|
||||
long days;
|
||||
|
||||
if (args[0]->null_value || args[1]->null_value ||
|
||||
yearnr < 0 || daynr <= 0)
|
||||
year < 0 || daynr <= 0)
|
||||
goto err;
|
||||
|
||||
days= calc_daynr(yearnr,1,1) + daynr - 1;
|
||||
if (year < 100)
|
||||
year= year_2000_handling(year);
|
||||
|
||||
days= calc_daynr(year,1,1) + daynr - 1;
|
||||
/* Day number from year 0 to 9999-12-31 */
|
||||
if (days >= 0 && days < MAX_DAY_NUMBER)
|
||||
{
|
||||
|
@ -2777,7 +2805,7 @@ void Item_func_add_time::fix_length_and_dec()
|
|||
String *Item_func_add_time::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME l_time1, l_time2, l_time3;
|
||||
MYSQL_TIME l_time1, l_time2, l_time3;
|
||||
bool is_time= 0;
|
||||
long days, microseconds;
|
||||
longlong seconds;
|
||||
|
@ -2879,7 +2907,7 @@ String *Item_func_timediff::val_str(String *str)
|
|||
longlong seconds;
|
||||
long microseconds;
|
||||
int l_sign= 1;
|
||||
TIME l_time1 ,l_time2, l_time3;
|
||||
MYSQL_TIME l_time1 ,l_time2, l_time3;
|
||||
|
||||
null_value= 0;
|
||||
if (args[0]->get_time(&l_time1) ||
|
||||
|
@ -2924,7 +2952,7 @@ null_date:
|
|||
String *Item_func_maketime::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
bool overflow= 0;
|
||||
|
||||
longlong hour= args[0]->val_int();
|
||||
|
@ -2968,7 +2996,8 @@ String *Item_func_maketime::val_str(String *str)
|
|||
char *ptr= longlong10_to_str(hour, buf, args[0]->unsigned_flag ? 10 : -10);
|
||||
int len = (int)(ptr - buf) +
|
||||
my_sprintf(ptr, (ptr, ":%02u:%02u", (uint)minute, (uint)second));
|
||||
make_truncated_value_warning(current_thd, buf, len, MYSQL_TIMESTAMP_TIME,
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
buf, len, MYSQL_TIMESTAMP_TIME,
|
||||
NullS);
|
||||
}
|
||||
|
||||
|
@ -2992,7 +3021,7 @@ String *Item_func_maketime::val_str(String *str)
|
|||
longlong Item_func_microsecond::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
if (!get_arg0_time(<ime))
|
||||
return ltime.second_part;
|
||||
return 0;
|
||||
|
@ -3001,7 +3030,7 @@ longlong Item_func_microsecond::val_int()
|
|||
|
||||
longlong Item_func_timestamp_diff::val_int()
|
||||
{
|
||||
TIME ltime1, ltime2;
|
||||
MYSQL_TIME ltime1, ltime2;
|
||||
longlong seconds;
|
||||
long microseconds;
|
||||
long months= 0;
|
||||
|
@ -3319,7 +3348,7 @@ void Item_func_str_to_date::fix_length_and_dec()
|
|||
}
|
||||
}
|
||||
|
||||
bool Item_func_str_to_date::get_date(TIME *ltime, uint fuzzy_date)
|
||||
bool Item_func_str_to_date::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
DATE_TIME_FORMAT date_time_format;
|
||||
char val_buff[64], format_buff[64];
|
||||
|
@ -3360,7 +3389,7 @@ null_date:
|
|||
String *Item_func_str_to_date::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
|
||||
if (Item_func_str_to_date::get_date(<ime, TIME_FUZZY_DATE))
|
||||
return 0;
|
||||
|
@ -3373,7 +3402,7 @@ String *Item_func_str_to_date::val_str(String *str)
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_last_day::get_date(TIME *ltime, uint fuzzy_date)
|
||||
bool Item_func_last_day::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
|
||||
{
|
||||
if (get_arg0_date(ltime, fuzzy_date & ~TIME_FUZZY_DATE) ||
|
||||
(ltime->month == 0))
|
||||
|
|
|
@ -432,9 +432,9 @@ public:
|
|||
/*
|
||||
Abstract method that defines which time zone is used for conversion.
|
||||
Converts time current time in my_time_t representation to broken-down
|
||||
TIME representation using UTC-SYSTEM or per-thread time zone.
|
||||
MYSQL_TIME representation using UTC-SYSTEM or per-thread time zone.
|
||||
*/
|
||||
virtual void store_now_in_TIME(TIME *now_time)=0;
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time)=0;
|
||||
bool result_as_longlong() { return TRUE; }
|
||||
};
|
||||
|
||||
|
@ -445,7 +445,7 @@ public:
|
|||
Item_func_curtime_local() :Item_func_curtime() {}
|
||||
Item_func_curtime_local(Item *a) :Item_func_curtime(a) {}
|
||||
const char *func_name() const { return "curtime"; }
|
||||
virtual void store_now_in_TIME(TIME *now_time);
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
};
|
||||
|
||||
|
||||
|
@ -455,7 +455,7 @@ public:
|
|||
Item_func_curtime_utc() :Item_func_curtime() {}
|
||||
Item_func_curtime_utc(Item *a) :Item_func_curtime(a) {}
|
||||
const char *func_name() const { return "utc_time"; }
|
||||
virtual void store_now_in_TIME(TIME *now_time);
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
};
|
||||
|
||||
|
||||
|
@ -464,14 +464,14 @@ public:
|
|||
class Item_func_curdate :public Item_date
|
||||
{
|
||||
longlong value;
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
public:
|
||||
Item_func_curdate() :Item_date() {}
|
||||
longlong val_int() { DBUG_ASSERT(fixed == 1); return (value) ; }
|
||||
String *val_str(String *str);
|
||||
void fix_length_and_dec();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
virtual void store_now_in_TIME(TIME *now_time)=0;
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time)=0;
|
||||
};
|
||||
|
||||
|
||||
|
@ -480,7 +480,7 @@ class Item_func_curdate_local :public Item_func_curdate
|
|||
public:
|
||||
Item_func_curdate_local() :Item_func_curdate() {}
|
||||
const char *func_name() const { return "curdate"; }
|
||||
void store_now_in_TIME(TIME *now_time);
|
||||
void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
};
|
||||
|
||||
|
||||
|
@ -489,7 +489,7 @@ class Item_func_curdate_utc :public Item_func_curdate
|
|||
public:
|
||||
Item_func_curdate_utc() :Item_func_curdate() {}
|
||||
const char *func_name() const { return "utc_date"; }
|
||||
void store_now_in_TIME(TIME *now_time);
|
||||
void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
};
|
||||
|
||||
|
||||
|
@ -501,7 +501,7 @@ protected:
|
|||
longlong value;
|
||||
char buff[20*2+32]; // +32 to make my_snprintf_{8bit|ucs2} happy
|
||||
uint buff_length;
|
||||
TIME ltime;
|
||||
MYSQL_TIME ltime;
|
||||
public:
|
||||
Item_func_now() :Item_date_func() {}
|
||||
Item_func_now(Item *a) :Item_date_func(a) {}
|
||||
|
@ -510,8 +510,8 @@ public:
|
|||
int save_in_field(Field *to, bool no_conversions);
|
||||
String *val_str(String *str);
|
||||
void fix_length_and_dec();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
virtual void store_now_in_TIME(TIME *now_time)=0;
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time)=0;
|
||||
};
|
||||
|
||||
|
||||
|
@ -521,7 +521,7 @@ public:
|
|||
Item_func_now_local() :Item_func_now() {}
|
||||
Item_func_now_local(Item *a) :Item_func_now(a) {}
|
||||
const char *func_name() const { return "now"; }
|
||||
virtual void store_now_in_TIME(TIME *now_time);
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
virtual enum Functype functype() const { return NOW_FUNC; }
|
||||
};
|
||||
|
||||
|
@ -532,7 +532,7 @@ public:
|
|||
Item_func_now_utc() :Item_func_now() {}
|
||||
Item_func_now_utc(Item *a) :Item_func_now(a) {}
|
||||
const char *func_name() const { return "utc_timestamp"; }
|
||||
virtual void store_now_in_TIME(TIME *now_time);
|
||||
virtual void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
};
|
||||
|
||||
|
||||
|
@ -547,13 +547,13 @@ public:
|
|||
Item_func_sysdate_local(Item *a) :Item_func_now(a) {}
|
||||
bool const_item() const { return 0; }
|
||||
const char *func_name() const { return "sysdate"; }
|
||||
void store_now_in_TIME(TIME *now_time);
|
||||
void store_now_in_TIME(MYSQL_TIME *now_time);
|
||||
double val_real();
|
||||
longlong val_int();
|
||||
int save_in_field(Field *to, bool no_conversions);
|
||||
String *val_str(String *str);
|
||||
void fix_length_and_dec();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
void update_used_tables()
|
||||
{
|
||||
Item_func_now::update_used_tables();
|
||||
|
@ -567,7 +567,7 @@ class Item_func_from_days :public Item_date
|
|||
public:
|
||||
Item_func_from_days(Item *a) :Item_date(a) {}
|
||||
const char *func_name() const { return "from_days"; }
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
};
|
||||
|
||||
|
||||
|
@ -597,7 +597,7 @@ class Item_func_from_unixtime :public Item_date_func
|
|||
String *val_str(String *str);
|
||||
const char *func_name() const { return "from_unixtime"; }
|
||||
void fix_length_and_dec();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
};
|
||||
|
||||
|
||||
|
@ -635,7 +635,7 @@ class Item_func_convert_tz :public Item_date_func
|
|||
const char *func_name() const { return "convert_tz"; }
|
||||
bool fix_fields(THD *, Item **);
|
||||
void fix_length_and_dec();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
void cleanup();
|
||||
};
|
||||
|
||||
|
@ -694,7 +694,7 @@ public:
|
|||
void fix_length_and_dec();
|
||||
enum_field_types field_type() const { return cached_field_type; }
|
||||
longlong val_int();
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
bool eq(const Item *item, bool binary_cmp) const;
|
||||
void print(String *str);
|
||||
};
|
||||
|
@ -778,7 +778,7 @@ public:
|
|||
Item_date_typecast(Item *a) :Item_typecast_maybe_null(a) {}
|
||||
const char *func_name() const { return "cast_as_date"; }
|
||||
String *val_str(String *str);
|
||||
bool get_date(TIME *ltime, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *ltime, uint fuzzy_date);
|
||||
const char *cast_type() const { return "date"; }
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_DATE; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
|
@ -812,7 +812,7 @@ public:
|
|||
Item_time_typecast(Item *a) :Item_typecast_maybe_null(a) {}
|
||||
const char *func_name() const { return "cast_as_time"; }
|
||||
String *val_str(String *str);
|
||||
bool get_time(TIME *ltime);
|
||||
bool get_time(MYSQL_TIME *ltime);
|
||||
const char *cast_type() const { return "time"; }
|
||||
enum_field_types field_type() const { return MYSQL_TYPE_TIME; }
|
||||
Field *tmp_table_field(TABLE *t_arg)
|
||||
|
@ -1033,7 +1033,7 @@ public:
|
|||
:Item_str_func(a, b)
|
||||
{}
|
||||
String *val_str(String *str);
|
||||
bool get_date(TIME *ltime, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *ltime, uint fuzzy_date);
|
||||
const char *func_name() const { return "str_to_date"; }
|
||||
enum_field_types field_type() const { return cached_field_type; }
|
||||
void fix_length_and_dec();
|
||||
|
@ -1046,5 +1046,5 @@ class Item_func_last_day :public Item_date
|
|||
public:
|
||||
Item_func_last_day(Item *a) :Item_date(a) {}
|
||||
const char *func_name() const { return "last_day"; }
|
||||
bool get_date(TIME *res, uint fuzzy_date);
|
||||
bool get_date(MYSQL_TIME *res, uint fuzzy_date);
|
||||
};
|
||||
|
|
|
@ -191,7 +191,7 @@ int str2my_decimal(uint mask, const char *from, uint length,
|
|||
}
|
||||
|
||||
|
||||
my_decimal *date2my_decimal(TIME *ltime, my_decimal *dec)
|
||||
my_decimal *date2my_decimal(MYSQL_TIME *ltime, my_decimal *dec)
|
||||
{
|
||||
longlong date;
|
||||
date = (ltime->year*100L + ltime->month)*100L + ltime->day;
|
||||
|
|
|
@ -296,7 +296,7 @@ int string2my_decimal(uint mask, const String *str, my_decimal *d)
|
|||
}
|
||||
|
||||
|
||||
my_decimal *date2my_decimal(TIME *ltime, my_decimal *dec);
|
||||
my_decimal *date2my_decimal(MYSQL_TIME *ltime, my_decimal *dec);
|
||||
|
||||
|
||||
#endif /*defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) */
|
||||
|
|
|
@ -1500,16 +1500,22 @@ ulong convert_period_to_month(ulong period);
|
|||
ulong convert_month_to_period(ulong month);
|
||||
void get_date_from_daynr(long daynr,uint *year, uint *month,
|
||||
uint *day);
|
||||
my_time_t TIME_to_timestamp(THD *thd, const TIME *t, my_bool *not_exist);
|
||||
bool str_to_time_with_warn(const char *str,uint length,TIME *l_time);
|
||||
my_time_t TIME_to_timestamp(THD *thd, const MYSQL_TIME *t, my_bool *not_exist);
|
||||
bool str_to_time_with_warn(const char *str,uint length,MYSQL_TIME *l_time);
|
||||
timestamp_type str_to_datetime_with_warn(const char *str, uint length,
|
||||
TIME *l_time, uint flags);
|
||||
void localtime_to_TIME(TIME *to, struct tm *from);
|
||||
void calc_time_from_sec(TIME *to, long seconds, long microseconds);
|
||||
MYSQL_TIME *l_time, uint flags);
|
||||
void localtime_to_TIME(MYSQL_TIME *to, struct tm *from);
|
||||
void calc_time_from_sec(MYSQL_TIME *to, long seconds, long microseconds);
|
||||
|
||||
void make_truncated_value_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
const char *str_val,
|
||||
uint str_length, timestamp_type time_type,
|
||||
const char *field_name);
|
||||
|
||||
bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, INTERVAL interval);
|
||||
bool calc_time_diff(MYSQL_TIME *l_time1, MYSQL_TIME *l_time2, int l_sign,
|
||||
longlong *seconds_out, long *microseconds_out);
|
||||
|
||||
void make_truncated_value_warning(THD *thd, const char *str_val,
|
||||
uint str_length, timestamp_type time_type,
|
||||
const char *field_name);
|
||||
extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type,
|
||||
const char *format_str,
|
||||
uint format_length);
|
||||
|
@ -1517,13 +1523,13 @@ extern DATE_TIME_FORMAT *date_time_format_copy(THD *thd,
|
|||
DATE_TIME_FORMAT *format);
|
||||
const char *get_date_time_format_str(KNOWN_DATE_TIME_FORMAT *format,
|
||||
timestamp_type type);
|
||||
extern bool make_date_time(DATE_TIME_FORMAT *format, TIME *l_time,
|
||||
extern bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time,
|
||||
timestamp_type type, String *str);
|
||||
void make_datetime(const DATE_TIME_FORMAT *format, const TIME *l_time,
|
||||
void make_datetime(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time,
|
||||
String *str);
|
||||
void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time,
|
||||
void make_date(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time,
|
||||
String *str);
|
||||
void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time,
|
||||
void make_time(const DATE_TIME_FORMAT *format, const MYSQL_TIME *l_time,
|
||||
String *str);
|
||||
|
||||
int test_if_number(char *str,int *res,bool allow_wildcards);
|
||||
|
@ -1543,7 +1549,7 @@ double my_double_round(double value, longlong dec, bool dec_unsigned,
|
|||
bool truncate);
|
||||
int get_quick_record(SQL_SELECT *select);
|
||||
int calc_weekday(long daynr,bool sunday_first_day_of_week);
|
||||
uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
|
||||
uint calc_week(MYSQL_TIME *l_time, uint week_behaviour, uint *year);
|
||||
void find_date(char *pos,uint *vek,uint flag);
|
||||
TYPELIB *convert_strings_to_array_type(my_string *typelibs, my_string *end);
|
||||
TYPELIB *typelib(MEM_ROOT *mem_root, List<String> &strings);
|
||||
|
|
|
@ -948,7 +948,7 @@ bool Protocol_simple::store(Field *field)
|
|||
*/
|
||||
|
||||
|
||||
bool Protocol_simple::store(TIME *tm)
|
||||
bool Protocol_simple::store(MYSQL_TIME *tm)
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
|
@ -971,7 +971,7 @@ bool Protocol_simple::store(TIME *tm)
|
|||
}
|
||||
|
||||
|
||||
bool Protocol_simple::store_date(TIME *tm)
|
||||
bool Protocol_simple::store_date(MYSQL_TIME *tm)
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
|
@ -990,7 +990,7 @@ bool Protocol_simple::store_date(TIME *tm)
|
|||
we support 0-6 decimals for time.
|
||||
*/
|
||||
|
||||
bool Protocol_simple::store_time(TIME *tm)
|
||||
bool Protocol_simple::store_time(MYSQL_TIME *tm)
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
DBUG_ASSERT(field_types == 0 ||
|
||||
|
@ -1162,7 +1162,7 @@ bool Protocol_prep::store(Field *field)
|
|||
}
|
||||
|
||||
|
||||
bool Protocol_prep::store(TIME *tm)
|
||||
bool Protocol_prep::store(MYSQL_TIME *tm)
|
||||
{
|
||||
char buff[12],*pos;
|
||||
uint length;
|
||||
|
@ -1188,7 +1188,7 @@ bool Protocol_prep::store(TIME *tm)
|
|||
return packet->append(buff, length+1, PACKET_BUFFER_EXTRA_ALLOC);
|
||||
}
|
||||
|
||||
bool Protocol_prep::store_date(TIME *tm)
|
||||
bool Protocol_prep::store_date(MYSQL_TIME *tm)
|
||||
{
|
||||
tm->hour= tm->minute= tm->second=0;
|
||||
tm->second_part= 0;
|
||||
|
@ -1196,7 +1196,7 @@ bool Protocol_prep::store_date(TIME *tm)
|
|||
}
|
||||
|
||||
|
||||
bool Protocol_prep::store_time(TIME *tm)
|
||||
bool Protocol_prep::store_time(MYSQL_TIME *tm)
|
||||
{
|
||||
char buff[13], *pos;
|
||||
uint length;
|
||||
|
|
|
@ -86,9 +86,9 @@ public:
|
|||
CHARSET_INFO *fromcs, CHARSET_INFO *tocs)=0;
|
||||
virtual bool store(float from, uint32 decimals, String *buffer)=0;
|
||||
virtual bool store(double from, uint32 decimals, String *buffer)=0;
|
||||
virtual bool store(TIME *time)=0;
|
||||
virtual bool store_date(TIME *time)=0;
|
||||
virtual bool store_time(TIME *time)=0;
|
||||
virtual bool store(MYSQL_TIME *time)=0;
|
||||
virtual bool store_date(MYSQL_TIME *time)=0;
|
||||
virtual bool store_time(MYSQL_TIME *time)=0;
|
||||
virtual bool store(Field *field)=0;
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
int begin_dataset();
|
||||
|
@ -116,9 +116,9 @@ public:
|
|||
virtual bool store(const char *from, uint length, CHARSET_INFO *cs);
|
||||
virtual bool store(const char *from, uint length,
|
||||
CHARSET_INFO *fromcs, CHARSET_INFO *tocs);
|
||||
virtual bool store(TIME *time);
|
||||
virtual bool store_date(TIME *time);
|
||||
virtual bool store_time(TIME *time);
|
||||
virtual bool store(MYSQL_TIME *time);
|
||||
virtual bool store_date(MYSQL_TIME *time);
|
||||
virtual bool store_time(MYSQL_TIME *time);
|
||||
virtual bool store(float nr, uint32 decimals, String *buffer);
|
||||
virtual bool store(double from, uint32 decimals, String *buffer);
|
||||
virtual bool store(Field *field);
|
||||
|
@ -150,9 +150,9 @@ public:
|
|||
virtual bool store(const char *from,uint length, CHARSET_INFO *cs);
|
||||
virtual bool store(const char *from, uint length,
|
||||
CHARSET_INFO *fromcs, CHARSET_INFO *tocs);
|
||||
virtual bool store(TIME *time);
|
||||
virtual bool store_date(TIME *time);
|
||||
virtual bool store_time(TIME *time);
|
||||
virtual bool store(MYSQL_TIME *time);
|
||||
virtual bool store_date(MYSQL_TIME *time);
|
||||
virtual bool store_time(MYSQL_TIME *time);
|
||||
virtual bool store(float nr, uint32 decimals, String *buffer);
|
||||
virtual bool store(double from, uint32 decimals, String *buffer);
|
||||
virtual bool store(Field *field);
|
||||
|
|
|
@ -752,7 +752,7 @@ print_field_values(THD *thd, TABLE *table,
|
|||
switch (used_field->field_type) {
|
||||
case MYSQL_TYPE_TIMESTAMP:
|
||||
{
|
||||
TIME tmp_time;
|
||||
MYSQL_TIME tmp_time;
|
||||
|
||||
bzero((char *)&tmp_time, sizeof(tmp_time));
|
||||
((Field_timestamp *) used_field->field)->get_time(&tmp_time);
|
||||
|
|
|
@ -5450,7 +5450,7 @@ fill_record(THD *thd, Field **ptr, List<Item> &values, bool ignore_errors)
|
|||
table= field->table;
|
||||
if (field == table->next_number_field)
|
||||
table->auto_increment_field_not_null= TRUE;
|
||||
if (value->save_in_field(field, 0) == -1)
|
||||
if (value->save_in_field(field, 0) < 0)
|
||||
goto err;
|
||||
}
|
||||
DBUG_RETURN(thd->net.report_error);
|
||||
|
|
|
@ -593,7 +593,7 @@ struct system_variables
|
|||
|
||||
Time_zone *time_zone;
|
||||
|
||||
/* DATE, DATETIME and TIME formats */
|
||||
/* DATE, DATETIME and MYSQL_TIME formats */
|
||||
DATE_TIME_FORMAT *date_format;
|
||||
DATE_TIME_FORMAT *datetime_format;
|
||||
DATE_TIME_FORMAT *time_format;
|
||||
|
|
|
@ -2433,7 +2433,7 @@ static int get_schema_tables_record(THD *thd, struct st_table_list *tables,
|
|||
const char *file_name)
|
||||
{
|
||||
const char *tmp_buff;
|
||||
TIME time;
|
||||
MYSQL_TIME time;
|
||||
CHARSET_INFO *cs= system_charset_info;
|
||||
DBUG_ENTER("get_schema_tables_record");
|
||||
|
||||
|
@ -2939,7 +2939,7 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
|
|||
{
|
||||
String tmp_string;
|
||||
String sp_db, sp_name, definer;
|
||||
TIME time;
|
||||
MYSQL_TIME time;
|
||||
LEX *lex= thd->lex;
|
||||
CHARSET_INFO *cs= system_charset_info;
|
||||
get_field(thd->mem_root, proc_table->field[0], &sp_db);
|
||||
|
|
|
@ -142,12 +142,11 @@ typedef struct st_read_record { /* Parameter to read_record */
|
|||
|
||||
|
||||
/*
|
||||
Originally MySQL used TIME structure inside server only, but since
|
||||
Originally MySQL used MYSQL_TIME structure inside server only, but since
|
||||
4.1 it's exported to user in the new client API. Define aliases for
|
||||
new names to keep existing code simple.
|
||||
*/
|
||||
|
||||
typedef struct st_mysql_time TIME;
|
||||
typedef enum enum_mysql_timestamp_type timestamp_type;
|
||||
|
||||
|
||||
|
|
38
sql/time.cc
38
sql/time.cc
|
@ -61,7 +61,7 @@ int calc_weekday(long daynr,bool sunday_first_day_of_week)
|
|||
next week is week 1.
|
||||
*/
|
||||
|
||||
uint calc_week(TIME *l_time, uint week_behaviour, uint *year)
|
||||
uint calc_week(MYSQL_TIME *l_time, uint week_behaviour, uint *year)
|
||||
{
|
||||
uint days;
|
||||
ulong daynr=calc_daynr(l_time->year,l_time->month,l_time->day);
|
||||
|
@ -179,7 +179,7 @@ ulong convert_month_to_period(ulong month)
|
|||
|
||||
|
||||
/*
|
||||
Convert a timestamp string to a TIME value and produce a warning
|
||||
Convert a timestamp string to a MYSQL_TIME value and produce a warning
|
||||
if string was truncated during conversion.
|
||||
|
||||
NOTE
|
||||
|
@ -187,7 +187,7 @@ ulong convert_month_to_period(ulong month)
|
|||
*/
|
||||
|
||||
timestamp_type
|
||||
str_to_datetime_with_warn(const char *str, uint length, TIME *l_time,
|
||||
str_to_datetime_with_warn(const char *str, uint length, MYSQL_TIME *l_time,
|
||||
uint flags)
|
||||
{
|
||||
int was_cut;
|
||||
|
@ -200,13 +200,14 @@ str_to_datetime_with_warn(const char *str, uint length, TIME *l_time,
|
|||
MODE_NO_ZERO_DATE))),
|
||||
&was_cut);
|
||||
if (was_cut || ts_type <= MYSQL_TIMESTAMP_ERROR)
|
||||
make_truncated_value_warning(current_thd, str, length, ts_type, NullS);
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
str, length, ts_type, NullS);
|
||||
return ts_type;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Convert a datetime from broken-down TIME representation to corresponding
|
||||
Convert a datetime from broken-down MYSQL_TIME representation to corresponding
|
||||
TIMESTAMP value.
|
||||
|
||||
SYNOPSIS
|
||||
|
@ -222,7 +223,7 @@ str_to_datetime_with_warn(const char *str, uint length, TIME *l_time,
|
|||
0 - t contains datetime value which is out of TIMESTAMP range.
|
||||
|
||||
*/
|
||||
my_time_t TIME_to_timestamp(THD *thd, const TIME *t, my_bool *in_dst_time_gap)
|
||||
my_time_t TIME_to_timestamp(THD *thd, const MYSQL_TIME *t, my_bool *in_dst_time_gap)
|
||||
{
|
||||
my_time_t timestamp;
|
||||
|
||||
|
@ -241,20 +242,20 @@ my_time_t TIME_to_timestamp(THD *thd, const TIME *t, my_bool *in_dst_time_gap)
|
|||
|
||||
|
||||
/*
|
||||
Convert a time string to a TIME struct and produce a warning
|
||||
Convert a time string to a MYSQL_TIME struct and produce a warning
|
||||
if string was cut during conversion.
|
||||
|
||||
NOTE
|
||||
See str_to_time() for more info.
|
||||
*/
|
||||
bool
|
||||
str_to_time_with_warn(const char *str, uint length, TIME *l_time)
|
||||
str_to_time_with_warn(const char *str, uint length, MYSQL_TIME *l_time)
|
||||
{
|
||||
int warning;
|
||||
bool ret_val= str_to_time(str, length, l_time, &warning);
|
||||
if (ret_val || warning)
|
||||
make_truncated_value_warning(current_thd, str, length,
|
||||
MYSQL_TIMESTAMP_TIME, NullS);
|
||||
make_truncated_value_warning(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
str, length, MYSQL_TIMESTAMP_TIME, NullS);
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
|
@ -263,7 +264,7 @@ str_to_time_with_warn(const char *str, uint length, TIME *l_time)
|
|||
Convert a system time structure to TIME
|
||||
*/
|
||||
|
||||
void localtime_to_TIME(TIME *to, struct tm *from)
|
||||
void localtime_to_TIME(MYSQL_TIME *to, struct tm *from)
|
||||
{
|
||||
to->neg=0;
|
||||
to->second_part=0;
|
||||
|
@ -275,7 +276,7 @@ void localtime_to_TIME(TIME *to, struct tm *from)
|
|||
to->second= (int) from->tm_sec;
|
||||
}
|
||||
|
||||
void calc_time_from_sec(TIME *to, long seconds, long microseconds)
|
||||
void calc_time_from_sec(MYSQL_TIME *to, long seconds, long microseconds)
|
||||
{
|
||||
long t_seconds;
|
||||
to->hour= seconds/3600L;
|
||||
|
@ -644,7 +645,7 @@ const char *get_date_time_format_str(KNOWN_DATE_TIME_FORMAT *format,
|
|||
MySQL doesn't support comparing of date/time/datetime strings that
|
||||
are not in arbutary order as dates are compared as strings in some
|
||||
context)
|
||||
This functions don't check that given TIME structure members are
|
||||
This functions don't check that given MYSQL_TIME structure members are
|
||||
in valid range. If they are not, return value won't reflect any
|
||||
valid date either. Additionally, make_time doesn't take into
|
||||
account time->day member: it's assumed that days have been converted
|
||||
|
@ -652,7 +653,7 @@ const char *get_date_time_format_str(KNOWN_DATE_TIME_FORMAT *format,
|
|||
****************************************************************************/
|
||||
|
||||
void make_time(const DATE_TIME_FORMAT *format __attribute__((unused)),
|
||||
const TIME *l_time, String *str)
|
||||
const MYSQL_TIME *l_time, String *str)
|
||||
{
|
||||
uint length= (uint) my_time_to_str(l_time, (char*) str->ptr());
|
||||
str->length(length);
|
||||
|
@ -661,7 +662,7 @@ void make_time(const DATE_TIME_FORMAT *format __attribute__((unused)),
|
|||
|
||||
|
||||
void make_date(const DATE_TIME_FORMAT *format __attribute__((unused)),
|
||||
const TIME *l_time, String *str)
|
||||
const MYSQL_TIME *l_time, String *str)
|
||||
{
|
||||
uint length= (uint) my_date_to_str(l_time, (char*) str->ptr());
|
||||
str->length(length);
|
||||
|
@ -670,7 +671,7 @@ void make_date(const DATE_TIME_FORMAT *format __attribute__((unused)),
|
|||
|
||||
|
||||
void make_datetime(const DATE_TIME_FORMAT *format __attribute__((unused)),
|
||||
const TIME *l_time, String *str)
|
||||
const MYSQL_TIME *l_time, String *str)
|
||||
{
|
||||
uint length= (uint) my_datetime_to_str(l_time, (char*) str->ptr());
|
||||
str->length(length);
|
||||
|
@ -678,7 +679,8 @@ void make_datetime(const DATE_TIME_FORMAT *format __attribute__((unused)),
|
|||
}
|
||||
|
||||
|
||||
void make_truncated_value_warning(THD *thd, const char *str_val,
|
||||
void make_truncated_value_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
|
||||
const char *str_val,
|
||||
uint str_length, timestamp_type time_type,
|
||||
const char *field_name)
|
||||
{
|
||||
|
@ -710,7 +712,7 @@ void make_truncated_value_warning(THD *thd, const char *str_val,
|
|||
cs->cset->snprintf(cs, warn_buff, sizeof(warn_buff),
|
||||
ER(ER_TRUNCATED_WRONG_VALUE),
|
||||
type_str, str.c_ptr());
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
push_warning(thd, level,
|
||||
ER_TRUNCATED_WRONG_VALUE, warn_buff);
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ typedef struct lsinfo
|
|||
|
||||
/*
|
||||
Structure with information describing ranges of my_time_t shifted to local
|
||||
time (my_time_t + offset). Used for local TIME -> my_time_t conversion.
|
||||
time (my_time_t + offset). Used for local MYSQL_TIME -> my_time_t conversion.
|
||||
See comments for TIME_to_gmt_sec() for more info.
|
||||
*/
|
||||
typedef struct revtinfo
|
||||
|
@ -292,9 +292,9 @@ tz_load(const char *name, TIME_ZONE_INFO *sp, MEM_ROOT *storage)
|
|||
be used if there are no transitions or we have moment in time before
|
||||
any transitions.
|
||||
Second task is to build "shifted my_time_t" -> my_time_t map used in
|
||||
TIME -> my_time_t conversion.
|
||||
MYSQL_TIME -> my_time_t conversion.
|
||||
Note: See description of TIME_to_gmt_sec() function first.
|
||||
In order to perform TIME -> my_time_t conversion we need to build table
|
||||
In order to perform MYSQL_TIME -> my_time_t conversion we need to build table
|
||||
which defines "shifted by tz offset and leap seconds my_time_t" ->
|
||||
my_time_t function wich is almost the same (except ranges of ambiguity)
|
||||
as reverse function to piecewise linear function used for my_time_t ->
|
||||
|
@ -531,14 +531,14 @@ static const uint year_lengths[2]=
|
|||
offset - local time zone offset
|
||||
|
||||
DESCRIPTION
|
||||
Convert my_time_t with offset to TIME struct. Differs from timesub
|
||||
Convert my_time_t with offset to MYSQL_TIME struct. Differs from timesub
|
||||
(from elsie code) because doesn't contain any leap correction and
|
||||
TM_GMTOFF and is_dst setting and contains some MySQL specific
|
||||
initialization. Funny but with removing of these we almost have
|
||||
glibc's offtime function.
|
||||
*/
|
||||
static void
|
||||
sec_to_TIME(TIME * tmp, my_time_t t, long offset)
|
||||
sec_to_TIME(MYSQL_TIME * tmp, my_time_t t, long offset)
|
||||
{
|
||||
long days;
|
||||
long rem;
|
||||
|
@ -594,7 +594,7 @@ sec_to_TIME(TIME * tmp, my_time_t t, long offset)
|
|||
tmp->month++;
|
||||
tmp->day= (uint)(days + 1);
|
||||
|
||||
/* filling MySQL specific TIME members */
|
||||
/* filling MySQL specific MYSQL_TIME members */
|
||||
tmp->neg= 0; tmp->second_part= 0;
|
||||
tmp->time_type= MYSQL_TIMESTAMP_DATETIME;
|
||||
}
|
||||
|
@ -686,7 +686,7 @@ find_transition_type(my_time_t t, const TIME_ZONE_INFO *sp)
|
|||
|
||||
/*
|
||||
Converts time in my_time_t representation (seconds in UTC since Epoch) to
|
||||
broken down TIME representation in local time zone.
|
||||
broken down MYSQL_TIME representation in local time zone.
|
||||
|
||||
SYNOPSIS
|
||||
gmt_sec_to_TIME()
|
||||
|
@ -701,12 +701,12 @@ find_transition_type(my_time_t t, const TIME_ZONE_INFO *sp)
|
|||
(60th and 61st second, look how we calculate them as "hit" in this
|
||||
function).
|
||||
Under realistic assumptions about frequency of transitions the same array
|
||||
can be used fot TIME -> my_time_t conversion. For this we need to
|
||||
can be used fot MYSQL_TIME -> my_time_t conversion. For this we need to
|
||||
implement tweaked binary search which will take into account that some
|
||||
TIME has two matching my_time_t ranges and some of them have none.
|
||||
MYSQL_TIME has two matching my_time_t ranges and some of them have none.
|
||||
*/
|
||||
static void
|
||||
gmt_sec_to_TIME(TIME *tmp, my_time_t sec_in_utc, const TIME_ZONE_INFO *sp)
|
||||
gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t sec_in_utc, const TIME_ZONE_INFO *sp)
|
||||
{
|
||||
const TRAN_TYPE_INFO *ttisp;
|
||||
const LS_INFO *lp;
|
||||
|
@ -809,7 +809,7 @@ sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec)
|
|||
|
||||
|
||||
/*
|
||||
Converts local time in broken down TIME representation to my_time_t
|
||||
Converts local time in broken down MYSQL_TIME representation to my_time_t
|
||||
representation.
|
||||
|
||||
SYNOPSIS
|
||||
|
@ -851,7 +851,7 @@ sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec)
|
|||
|
||||
We use completely different approach. It is better since it is both
|
||||
faster than iterative implementations and fully determenistic. If you
|
||||
look at my_time_t to TIME conversion then you'll find that it consist
|
||||
look at my_time_t to MYSQL_TIME conversion then you'll find that it consist
|
||||
of two steps:
|
||||
The first is calculating shifted my_time_t value and the second - TIME
|
||||
calculation from shifted my_time_t value (well it is a bit simplified
|
||||
|
@ -881,7 +881,7 @@ sec_since_epoch(int year, int mon, int mday, int hour, int min ,int sec)
|
|||
0 in case of error.
|
||||
*/
|
||||
static my_time_t
|
||||
TIME_to_gmt_sec(const TIME *t, const TIME_ZONE_INFO *sp,
|
||||
TIME_to_gmt_sec(const MYSQL_TIME *t, const TIME_ZONE_INFO *sp,
|
||||
my_bool *in_dst_time_gap)
|
||||
{
|
||||
my_time_t local_t;
|
||||
|
@ -1008,20 +1008,20 @@ class Time_zone_system : public Time_zone
|
|||
{
|
||||
public:
|
||||
Time_zone_system() {} /* Remove gcc warning */
|
||||
virtual my_time_t TIME_to_gmt_sec(const TIME *t,
|
||||
virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t,
|
||||
my_bool *in_dst_time_gap) const;
|
||||
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
|
||||
virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const;
|
||||
virtual const String * get_name() const;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Converts local time in system time zone in TIME representation
|
||||
Converts local time in system time zone in MYSQL_TIME representation
|
||||
to its my_time_t representation.
|
||||
|
||||
SYNOPSIS
|
||||
TIME_to_gmt_sec()
|
||||
t - pointer to TIME structure with local time in
|
||||
t - pointer to MYSQL_TIME structure with local time in
|
||||
broken-down representation.
|
||||
in_dst_time_gap - pointer to bool which is set to true if datetime
|
||||
value passed doesn't really exist (i.e. falls into
|
||||
|
@ -1029,7 +1029,7 @@ public:
|
|||
|
||||
DESCRIPTION
|
||||
This method uses system function (localtime_r()) for conversion
|
||||
local time in system time zone in TIME structure to its my_time_t
|
||||
local time in system time zone in MYSQL_TIME structure to its my_time_t
|
||||
representation. Unlike the same function for Time_zone_db class
|
||||
it it won't handle unnormalized input properly. Still it will
|
||||
return lowest possible my_time_t in case of ambiguity or if we
|
||||
|
@ -1041,7 +1041,7 @@ public:
|
|||
Corresponding my_time_t value or 0 in case of error
|
||||
*/
|
||||
my_time_t
|
||||
Time_zone_system::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
||||
Time_zone_system::TIME_to_gmt_sec(const MYSQL_TIME *t, my_bool *in_dst_time_gap) const
|
||||
{
|
||||
long not_used;
|
||||
return my_system_gmt_sec(t, ¬_used, in_dst_time_gap);
|
||||
|
@ -1054,7 +1054,7 @@ Time_zone_system::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
|||
|
||||
SYNOPSIS
|
||||
gmt_sec_to_TIME()
|
||||
tmp - pointer to TIME structure to fill-in
|
||||
tmp - pointer to MYSQL_TIME structure to fill-in
|
||||
t - my_time_t value to be converted
|
||||
|
||||
NOTE
|
||||
|
@ -1065,7 +1065,7 @@ Time_zone_system::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
|||
the 1902 easily.
|
||||
*/
|
||||
void
|
||||
Time_zone_system::gmt_sec_to_TIME(TIME *tmp, my_time_t t) const
|
||||
Time_zone_system::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
||||
{
|
||||
struct tm tmp_tm;
|
||||
time_t tmp_t= (time_t)t;
|
||||
|
@ -1095,26 +1095,26 @@ Time_zone_system::get_name() const
|
|||
/*
|
||||
Instance of this class represents UTC time zone. It uses system gmtime_r
|
||||
function for conversions and is always available. It is used only for
|
||||
my_time_t -> TIME conversions in various UTC_... functions, it is not
|
||||
intended for TIME -> my_time_t conversions and shouldn't be exposed to user.
|
||||
my_time_t -> MYSQL_TIME conversions in various UTC_... functions, it is not
|
||||
intended for MYSQL_TIME -> my_time_t conversions and shouldn't be exposed to user.
|
||||
*/
|
||||
class Time_zone_utc : public Time_zone
|
||||
{
|
||||
public:
|
||||
Time_zone_utc() {} /* Remove gcc warning */
|
||||
virtual my_time_t TIME_to_gmt_sec(const TIME *t,
|
||||
virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t,
|
||||
my_bool *in_dst_time_gap) const;
|
||||
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
|
||||
virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const;
|
||||
virtual const String * get_name() const;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Convert UTC time from TIME representation to its my_time_t representation.
|
||||
Convert UTC time from MYSQL_TIME representation to its my_time_t representation.
|
||||
|
||||
SYNOPSIS
|
||||
TIME_to_gmt_sec()
|
||||
t - pointer to TIME structure with local time
|
||||
t - pointer to MYSQL_TIME structure with local time
|
||||
in broken-down representation.
|
||||
in_dst_time_gap - pointer to bool which is set to true if datetime
|
||||
value passed doesn't really exist (i.e. falls into
|
||||
|
@ -1129,7 +1129,7 @@ public:
|
|||
0
|
||||
*/
|
||||
my_time_t
|
||||
Time_zone_utc::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
||||
Time_zone_utc::TIME_to_gmt_sec(const MYSQL_TIME *t, my_bool *in_dst_time_gap) const
|
||||
{
|
||||
/* Should be never called */
|
||||
DBUG_ASSERT(0);
|
||||
|
@ -1143,14 +1143,14 @@ Time_zone_utc::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
|||
|
||||
SYNOPSIS
|
||||
gmt_sec_to_TIME()
|
||||
tmp - pointer to TIME structure to fill-in
|
||||
tmp - pointer to MYSQL_TIME structure to fill-in
|
||||
t - my_time_t value to be converted
|
||||
|
||||
NOTE
|
||||
See note for apropriate Time_zone_system method.
|
||||
*/
|
||||
void
|
||||
Time_zone_utc::gmt_sec_to_TIME(TIME *tmp, my_time_t t) const
|
||||
Time_zone_utc::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
||||
{
|
||||
struct tm tmp_tm;
|
||||
time_t tmp_t= (time_t)t;
|
||||
|
@ -1191,9 +1191,9 @@ class Time_zone_db : public Time_zone
|
|||
{
|
||||
public:
|
||||
Time_zone_db(TIME_ZONE_INFO *tz_info_arg, const String * tz_name_arg);
|
||||
virtual my_time_t TIME_to_gmt_sec(const TIME *t,
|
||||
virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t,
|
||||
my_bool *in_dst_time_gap) const;
|
||||
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
|
||||
virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const;
|
||||
virtual const String * get_name() const;
|
||||
private:
|
||||
TIME_ZONE_INFO *tz_info;
|
||||
|
@ -1227,7 +1227,7 @@ Time_zone_db::Time_zone_db(TIME_ZONE_INFO *tz_info_arg,
|
|||
|
||||
SYNOPSIS
|
||||
TIME_to_gmt_sec()
|
||||
t - pointer to TIME structure with local time
|
||||
t - pointer to MYSQL_TIME structure with local time
|
||||
in broken-down representation.
|
||||
in_dst_time_gap - pointer to bool which is set to true if datetime
|
||||
value passed doesn't really exist (i.e. falls into
|
||||
|
@ -1241,7 +1241,7 @@ Time_zone_db::Time_zone_db(TIME_ZONE_INFO *tz_info_arg,
|
|||
Corresponding my_time_t value or 0 in case of error
|
||||
*/
|
||||
my_time_t
|
||||
Time_zone_db::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
||||
Time_zone_db::TIME_to_gmt_sec(const MYSQL_TIME *t, my_bool *in_dst_time_gap) const
|
||||
{
|
||||
return ::TIME_to_gmt_sec(t, tz_info, in_dst_time_gap);
|
||||
}
|
||||
|
@ -1253,11 +1253,11 @@ Time_zone_db::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
|||
|
||||
SYNOPSIS
|
||||
gmt_sec_to_TIME()
|
||||
tmp - pointer to TIME structure to fill-in
|
||||
tmp - pointer to MYSQL_TIME structure to fill-in
|
||||
t - my_time_t value to be converted
|
||||
*/
|
||||
void
|
||||
Time_zone_db::gmt_sec_to_TIME(TIME *tmp, my_time_t t) const
|
||||
Time_zone_db::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
||||
{
|
||||
::gmt_sec_to_TIME(tmp, t, tz_info);
|
||||
}
|
||||
|
@ -1287,9 +1287,9 @@ class Time_zone_offset : public Time_zone
|
|||
{
|
||||
public:
|
||||
Time_zone_offset(long tz_offset_arg);
|
||||
virtual my_time_t TIME_to_gmt_sec(const TIME *t,
|
||||
virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t,
|
||||
my_bool *in_dst_time_gap) const;
|
||||
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const;
|
||||
virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const;
|
||||
virtual const String * get_name() const;
|
||||
/*
|
||||
This have to be public because we want to be able to access it from
|
||||
|
@ -1324,11 +1324,11 @@ Time_zone_offset::Time_zone_offset(long tz_offset_arg):
|
|||
|
||||
/*
|
||||
Converts local time in time zone described as offset from UTC
|
||||
from TIME representation to its my_time_t representation.
|
||||
from MYSQL_TIME representation to its my_time_t representation.
|
||||
|
||||
SYNOPSIS
|
||||
TIME_to_gmt_sec()
|
||||
t - pointer to TIME structure with local time
|
||||
t - pointer to MYSQL_TIME structure with local time
|
||||
in broken-down representation.
|
||||
in_dst_time_gap - pointer to bool which should be set to true if
|
||||
datetime value passed doesn't really exist
|
||||
|
@ -1340,7 +1340,7 @@ Time_zone_offset::Time_zone_offset(long tz_offset_arg):
|
|||
Corresponding my_time_t value or 0 in case of error
|
||||
*/
|
||||
my_time_t
|
||||
Time_zone_offset::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
||||
Time_zone_offset::TIME_to_gmt_sec(const MYSQL_TIME *t, my_bool *in_dst_time_gap) const
|
||||
{
|
||||
my_time_t local_t;
|
||||
int shift= 0;
|
||||
|
@ -1385,11 +1385,11 @@ Time_zone_offset::TIME_to_gmt_sec(const TIME *t, my_bool *in_dst_time_gap) const
|
|||
|
||||
SYNOPSIS
|
||||
gmt_sec_to_TIME()
|
||||
tmp - pointer to TIME structure to fill-in
|
||||
tmp - pointer to MYSQL_TIME structure to fill-in
|
||||
t - my_time_t value to be converted
|
||||
*/
|
||||
void
|
||||
Time_zone_offset::gmt_sec_to_TIME(TIME *tmp, my_time_t t) const
|
||||
Time_zone_offset::gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const
|
||||
{
|
||||
sec_to_TIME(tmp, t, offset);
|
||||
}
|
||||
|
@ -2651,7 +2651,7 @@ main(int argc, char **argv)
|
|||
my_bool localtime_negative;
|
||||
TIME_ZONE_INFO tz_info;
|
||||
struct tm tmp;
|
||||
TIME time_tmp;
|
||||
MYSQL_TIME time_tmp;
|
||||
time_t t, t1, t2;
|
||||
char fullname[FN_REFLEN+1];
|
||||
char *str_end;
|
||||
|
|
10
sql/tztime.h
10
sql/tztime.h
|
@ -22,7 +22,7 @@
|
|||
|
||||
/*
|
||||
This class represents abstract time zone and provides
|
||||
basic interface for TIME <-> my_time_t conversion.
|
||||
basic interface for MYSQL_TIME <-> my_time_t conversion.
|
||||
Actual time zones which are specified by DB, or via offset
|
||||
or use system functions are its descendants.
|
||||
*/
|
||||
|
@ -31,18 +31,18 @@ class Time_zone: public Sql_alloc
|
|||
public:
|
||||
Time_zone() {} /* Remove gcc warning */
|
||||
/*
|
||||
Converts local time in broken down TIME representation to
|
||||
Converts local time in broken down MYSQL_TIME representation to
|
||||
my_time_t (UTC seconds since Epoch) represenation.
|
||||
Returns 0 in case of error. Sets in_dst_time_gap to true if date provided
|
||||
falls into spring time-gap (or lefts it untouched otherwise).
|
||||
*/
|
||||
virtual my_time_t TIME_to_gmt_sec(const TIME *t,
|
||||
virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t,
|
||||
my_bool *in_dst_time_gap) const = 0;
|
||||
/*
|
||||
Converts time in my_time_t representation to local time in
|
||||
broken down TIME representation.
|
||||
broken down MYSQL_TIME representation.
|
||||
*/
|
||||
virtual void gmt_sec_to_TIME(TIME *tmp, my_time_t t) const = 0;
|
||||
virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const = 0;
|
||||
/*
|
||||
Because of constness of String returned by get_name() time zone name
|
||||
have to be already zeroended to be able to use String::ptr() instead
|
||||
|
|
|
@ -859,7 +859,9 @@ static bool make_empty_rec(THD *thd, File file,enum db_type table_type,
|
|||
(regfield->real_type() != FIELD_TYPE_YEAR ||
|
||||
field->def->val_int() != 0))
|
||||
{
|
||||
if (field->def->save_in_field(regfield, 1))
|
||||
int res= field->def->save_in_field(regfield, 1);
|
||||
/* If not ok or warning of level 'note' */
|
||||
if (res != 0 && res != 3)
|
||||
{
|
||||
my_error(ER_INVALID_DEFAULT, MYF(0), regfield->field_name);
|
||||
error= 1;
|
||||
|
|
Loading…
Reference in a new issue