1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#
#
#
#
#
#
#
diff -ruN a/sql/field.cc b/sql/field.cc
--- a/sql/field.cc 2011-05-13 18:20:42.000000000 +0400
+++ b/sql/field.cc 2011-05-13 18:20:47.000000000 +0400
@@ -10164,10 +10164,15 @@
If we have TIMESTAMP NULL column without explicit DEFAULT value
we treat it as having DEFAULT NULL attribute.
+
+ TIMESTAMP NOT NULL DEFAULT NULL is a special syntax to denote
+ no default (i.e. not even implicit value of 0) for TIMESTAMP.
*/
unireg_check= (fld_on_update_value ? Field::TIMESTAMP_UN_FIELD :
- (flags & NOT_NULL_FLAG ? Field::TIMESTAMP_OLD_FIELD :
- Field::NONE));
+ (flags & NOT_NULL_FLAG ?
+ (flags & NO_DEFAULT_VALUE_FLAG ?
+ Field::NONE : Field::TIMESTAMP_OLD_FIELD)
+ : Field::NONE));
}
break;
case MYSQL_TYPE_DATE:
diff -ruN a/sql/sql_parse.cc b/sql/sql_parse.cc
--- a/sql/sql_parse.cc 2011-05-13 18:20:39.000000000 +0400
+++ b/sql/sql_parse.cc 2011-05-13 18:20:47.000000000 +0400
@@ -6401,7 +6401,16 @@
else if (default_value->type() == Item::NULL_ITEM)
{
default_value= 0;
- if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) ==
+ if (type == MYSQL_TYPE_TIMESTAMP && type_modifier & NOT_NULL_FLAG)
+ {
+ /*
+ For TIMESTAMP fields "NOT NULL DEFAULT NULL" is a special syntax
+ reserved to create TIMESTAMP fields without any default values rather
+ than an implicit default value (0).
+ */
+ type_modifier|= NO_DEFAULT_VALUE_FLAG;
+ }
+ else if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) ==
NOT_NULL_FLAG)
{
my_error(ER_INVALID_DEFAULT, MYF(0), field_name->str);
diff -ruN a/sql/sql_show.cc b/sql/sql_show.cc
--- a/sql/sql_show.cc 2011-05-13 18:20:37.000000000 +0400
+++ b/sql/sql_show.cc 2011-05-13 18:20:47.000000000 +0400
@@ -1352,7 +1352,16 @@
}
if (flags & NOT_NULL_FLAG)
+ {
packet->append(STRING_WITH_LEN(" NOT NULL"));
+ /*
+ TIMESTAMP NOT NULL DEFAULT NULL is a special syntax to denote
+ no default (i.e. not even implicit value of 0) for TIMESTAMP.
+ */
+ if (field->type() == MYSQL_TYPE_TIMESTAMP &&
+ field->flags & NO_DEFAULT_VALUE_FLAG)
+ packet->append(STRING_WITH_LEN(" DEFAULT NULL"));
+ }
else if (field->type() == MYSQL_TYPE_TIMESTAMP)
{
/*
|