Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
fac05850
Commit
fac05850
authored
Aug 02, 2005
by
jimw@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Generate a warning/error when DATE_SUB/ADD() functions calculate a date
that is outside the acceptable date range. (Bug #10627)
parent
2889025a
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
60 additions
and
4 deletions
+60
-4
mysql-test/r/func_date_add.result
mysql-test/r/func_date_add.result
+26
-0
mysql-test/t/func_date_add.test
mysql-test/t/func_date_add.test
+23
-0
sql/item_timefunc.cc
sql/item_timefunc.cc
+9
-4
sql/share/errmsg.txt
sql/share/errmsg.txt
+2
-0
No files found.
mysql-test/r/func_date_add.result
View file @
fac05850
...
...
@@ -45,3 +45,29 @@ visitor_id mts
465931136 2000-03-18 16:09:53
1092858576 2000-03-19 01:34:45
drop table t1;
set sql_mode='traditional';
create table t1 (d date);
insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR);
ERROR 22008: Datetime function: datetime field overflow
insert into t1 (d) select date_add('2000-01-01',interval 8000 year);
ERROR 22008: Datetime function: datetime field overflow
insert into t1 values (date_add(NULL, INTERVAL 1 DAY));
insert into t1 values (date_add('2000-01-04', INTERVAL NULL DAY));
set sql_mode='';
insert into t1 (d) select date_sub('2000-01-01', INTERVAL 2001 YEAR);
Warnings:
Warning 1437 Datetime function: datetime field overflow
insert into t1 (d) select date_add('2000-01-01',interval 8000 year);
Warnings:
Warning 1437 Datetime function: datetime field overflow
insert into t1 values (date_add(NULL, INTERVAL 1 DAY));
insert into t1 values (date_add('2000-01-04', INTERVAL NULL DAY));
select * from t1;
d
NULL
NULL
NULL
NULL
NULL
NULL
drop table t1;
mysql-test/t/func_date_add.test
View file @
fac05850
...
...
@@ -41,4 +41,27 @@ select visitor_id,max(ts) as mts from t1 group by visitor_id
having
DATE_ADD
(
mts
,
INTERVAL
3
MONTH
)
<
NOW
();
drop
table
t1
;
#
# Bug #10627: Invalid date turned to NULL from date_sub/date_add in
# traditional mode
#
set
sql_mode
=
'traditional'
;
create
table
t1
(
d
date
);
--
error
S22008
insert
into
t1
(
d
)
select
date_sub
(
'2000-01-01'
,
INTERVAL
2001
YEAR
);
--
error
S22008
insert
into
t1
(
d
)
select
date_add
(
'2000-01-01'
,
interval
8000
year
);
# No warnings/errors from the next two
insert
into
t1
values
(
date_add
(
NULL
,
INTERVAL
1
DAY
));
insert
into
t1
values
(
date_add
(
'2000-01-04'
,
INTERVAL
NULL
DAY
));
set
sql_mode
=
''
;
# These will all work now, and we'll end up with some NULL entries in the
# table and some warnings.
insert
into
t1
(
d
)
select
date_sub
(
'2000-01-01'
,
INTERVAL
2001
YEAR
);
insert
into
t1
(
d
)
select
date_add
(
'2000-01-01'
,
interval
8000
year
);
insert
into
t1
values
(
date_add
(
NULL
,
INTERVAL
1
DAY
));
insert
into
t1
values
(
date_add
(
'2000-01-04'
,
INTERVAL
NULL
DAY
));
select
*
from
t1
;
drop
table
t1
;
# End of 4.1 tests
sql/item_timefunc.cc
View file @
fac05850
...
...
@@ -1938,7 +1938,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
daynr
=
calc_daynr
(
ltime
->
year
,
ltime
->
month
,
1
)
+
days
;
/* Day number from year 0 to 9999-12-31 */
if
((
ulonglong
)
daynr
>=
MAX_DAY_NUMBER
)
goto
null
_date
;
goto
invalid
_date
;
get_date_from_daynr
((
long
)
daynr
,
&
ltime
->
year
,
&
ltime
->
month
,
&
ltime
->
day
);
break
;
...
...
@@ -1949,13 +1949,13 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
sign
*
(
long
)
interval
.
day
);
/* Daynumber from year 0 to 9999-12-31 */
if
((
ulong
)
period
>=
MAX_DAY_NUMBER
)
goto
null
_date
;
goto
invalid
_date
;
get_date_from_daynr
((
long
)
period
,
&
ltime
->
year
,
&
ltime
->
month
,
&
ltime
->
day
);
break
;
case
INTERVAL_YEAR
:
ltime
->
year
+=
sign
*
(
long
)
interval
.
year
;
if
((
ulong
)
ltime
->
year
>=
10000L
)
goto
null
_date
;
goto
invalid
_date
;
if
(
ltime
->
month
==
2
&&
ltime
->
day
==
29
&&
calc_days_in_year
(
ltime
->
year
)
!=
366
)
ltime
->
day
=
28
;
// Was leap-year
...
...
@@ -1966,7 +1966,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
period
=
(
ltime
->
year
*
12
+
sign
*
(
long
)
interval
.
year
*
12
+
ltime
->
month
-
1
+
sign
*
(
long
)
interval
.
month
);
if
((
ulong
)
period
>=
120000L
)
goto
null
_date
;
goto
invalid
_date
;
ltime
->
year
=
(
uint
)
(
period
/
12
);
ltime
->
month
=
(
uint
)
(
period
%
12L
)
+
1
;
/* Adjust day if the new month doesn't have enough days */
...
...
@@ -1982,6 +1982,11 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
}
return
0
;
// Ok
invalid_date:
push_warning_printf
(
current_thd
,
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
ER_DATETIME_FUNCTION_OVERFLOW
,
ER
(
ER_DATETIME_FUNCTION_OVERFLOW
),
"datetime"
);
null_date:
return
(
null_value
=
1
);
}
...
...
sql/share/errmsg.txt
View file @
fac05850
...
...
@@ -5386,3 +5386,5 @@ ER_TRG_IN_WRONG_SCHEMA
eng "Trigger in wrong schema"
ER_STACK_OVERRUN_NEED_MORE
eng "Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack."
ER_DATETIME_FUNCTION_OVERFLOW 22008
eng "Datetime function: %-.32s field overflow"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment