Skip to content

Commit 6164157

Browse files
author
Jan Lindström
committed
MDEV-7254: Assigned expression is evaluated twice when updating
column TIMESTAMP NOT NULL Analysis: Problem was that value->is_null() function is called even when user had explicitly set the value for timestamp field. Calling this function had the side effect that expression was evaluated twice. Fix: (by Sergei Golubchik) check instead value->null_value.
1 parent 813af4c commit 6164157

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

mysql-test/r/type_timestamp.result

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,3 +645,47 @@ MAX(dt) = '2011-01-06 12:34:30'
645645
1
646646
DROP TABLE t1;
647647
End of 5.5 tests
648+
#
649+
# MDEV-7254: Assigned expression is evaluated twice when updating column TIMESTAMP NOT NULL
650+
#
651+
create table t1(value timestamp not null);
652+
set @a:=0;
653+
create function f1 () returns timestamp
654+
begin
655+
set @a = @a + 1;
656+
return NULL;
657+
end//
658+
set timestamp=12340;
659+
insert t1 values (f1());
660+
select @a, value from t1;
661+
@a value
662+
1 1970-01-01 05:25:40
663+
set timestamp=12350;
664+
update t1 set value = f1();
665+
select @a, value from t1;
666+
@a value
667+
2 1970-01-01 05:25:50
668+
drop table t1;
669+
drop function f1;
670+
set timestamp=0;
671+
create table t1(value timestamp null);
672+
set @a:=0;
673+
create function f1 () returns timestamp
674+
begin
675+
set @a = @a + 1;
676+
return NULL;
677+
end//
678+
set timestamp=12340;
679+
insert t1 values (f1());
680+
select @a, value from t1;
681+
@a value
682+
1 NULL
683+
set timestamp=12350;
684+
update t1 set value = f1();
685+
select @a, value from t1;
686+
@a value
687+
2 NULL
688+
drop table t1;
689+
drop function f1;
690+
set timestamp=0;
691+
End of 10.0 tests

mysql-test/t/type_timestamp.test

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,3 +446,48 @@ SELECT MAX(dt) = '2011-01-06 12:34:30' FROM t1;
446446
DROP TABLE t1;
447447

448448
--echo End of 5.5 tests
449+
450+
--echo #
451+
--echo # MDEV-7254: Assigned expression is evaluated twice when updating column TIMESTAMP NOT NULL
452+
--echo #
453+
454+
create table t1(value timestamp not null);
455+
set @a:=0;
456+
delimiter //;
457+
create function f1 () returns timestamp
458+
begin
459+
set @a = @a + 1;
460+
return NULL;
461+
end//
462+
delimiter ;//
463+
set timestamp=12340;
464+
insert t1 values (f1());
465+
select @a, value from t1;
466+
set timestamp=12350;
467+
update t1 set value = f1();
468+
select @a, value from t1;
469+
drop table t1;
470+
drop function f1;
471+
set timestamp=0;
472+
473+
# Verify no regressions to TIMESTAMP NULL
474+
create table t1(value timestamp null);
475+
set @a:=0;
476+
delimiter //;
477+
create function f1 () returns timestamp
478+
begin
479+
set @a = @a + 1;
480+
return NULL;
481+
end//
482+
delimiter ;//
483+
set timestamp=12340;
484+
insert t1 values (f1());
485+
select @a, value from t1;
486+
set timestamp=12350;
487+
update t1 set value = f1();
488+
select @a, value from t1;
489+
drop table t1;
490+
drop function f1;
491+
set timestamp=0;
492+
493+
--echo End of 10.0 tests

sql/field.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4899,7 +4899,7 @@ void Field_timestamp::set_explicit_default(Item *value)
48994899
{
49004900
if (((value->type() == Item::DEFAULT_VALUE_ITEM &&
49014901
!((Item_default_value*)value)->arg) ||
4902-
(!maybe_null() && value->is_null())))
4902+
(!maybe_null() && value->null_value)))
49034903
return;
49044904
set_has_explicit_value();
49054905
}

0 commit comments

Comments
 (0)