~percona-dev/percona-server/release-5.1.57-12-rnt-backup

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)
     {
       /*