Commit 6bf1306b authored by anozdrin/alik@quad's avatar anozdrin/alik@quad

A patch for Bug#18834: ALTER TABLE ADD INDEX on table with

two timestamp fields.
  
The actual problem here was that CREATE TABLE allowed zero
date as a default value for a TIMESTAMP column in NO_ZERO_DATE mode.
  
The thing is that for TIMESTAMP date type specific rule is applied:
  column_name TIMESTAMP == column_name TIMESTAMP DEFAULT 0
whever for any other date data type
  column_name TYPE == column_name TYPE DEFAULT NULL
  
The fix is to raise an error when we're in NO_ZERO_DATE mode and
there is TIMESTAMP column w/o default value.
parent 7e88f771
......@@ -1789,4 +1789,48 @@ DROP TABLE t2;
# -- End of test case for Bug#21380.
# --
# -- Bug#18834: ALTER TABLE ADD INDEX on table with two timestamp fields
# --
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
CREATE TABLE t1(c1 TIMESTAMP, c2 TIMESTAMP);
SET sql_mode = NO_ZERO_DATE;
CREATE TABLE t2(c1 TIMESTAMP, c2 TIMESTAMP DEFAULT 0);
ERROR 42000: Invalid default value for 'c2'
CREATE TABLE t2(c1 TIMESTAMP, c2 TIMESTAMP);
ERROR 42000: Invalid default value for 'c2'
# -- Check that NULL column still can be created.
CREATE TABLE t2(c1 TIMESTAMP NULL);
# -- Check ALTER TABLE.
ALTER TABLE t1 ADD INDEX(c1);
ERROR 42000: Invalid default value for 'c2'
# -- Check DATETIME.
SET sql_mode = '';
CREATE TABLE t3(c1 DATETIME NOT NULL);
INSERT INTO t3 VALUES (0);
SET sql_mode = TRADITIONAL;
ALTER TABLE t3 ADD INDEX(c1);
ERROR 22007: Incorrect datetime value: '0000-00-00 00:00:00' for column 'c1' at row 1
# -- Cleanup.
SET sql_mode = '';
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
# -- End of Bug#18834.
End of 5.1 tests
......@@ -1385,4 +1385,68 @@ DROP TABLE t2;
--echo # -- End of test case for Bug#21380.
--echo
--echo # --
--echo # -- Bug#18834: ALTER TABLE ADD INDEX on table with two timestamp fields
--echo # --
--echo
--disable_warnings
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
--enable_warnings
--echo
CREATE TABLE t1(c1 TIMESTAMP, c2 TIMESTAMP);
--echo
SET sql_mode = NO_ZERO_DATE;
--echo
--error ER_INVALID_DEFAULT
CREATE TABLE t2(c1 TIMESTAMP, c2 TIMESTAMP DEFAULT 0);
--echo
--error ER_INVALID_DEFAULT
CREATE TABLE t2(c1 TIMESTAMP, c2 TIMESTAMP);
--echo
--echo # -- Check that NULL column still can be created.
CREATE TABLE t2(c1 TIMESTAMP NULL);
--echo
--echo # -- Check ALTER TABLE.
--error ER_INVALID_DEFAULT
ALTER TABLE t1 ADD INDEX(c1);
--echo
--echo # -- Check DATETIME.
SET sql_mode = '';
--echo
CREATE TABLE t3(c1 DATETIME NOT NULL);
INSERT INTO t3 VALUES (0);
--echo
SET sql_mode = TRADITIONAL;
--echo
--error ER_TRUNCATED_WRONG_VALUE
ALTER TABLE t3 ADD INDEX(c1);
--echo
--echo # -- Cleanup.
SET sql_mode = '';
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
--echo
--echo # -- End of Bug#18834.
--echo
--echo End of 5.1 tests
......@@ -3001,6 +3001,37 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
(qsort_cmp) sort_keys);
create_info->null_bits= null_fields;
/* Check fields. */
it.rewind();
while ((sql_field=it++))
{
Field::utype type= (Field::utype) MTYP_TYPENR(sql_field->unireg_check);
if (thd->variables.sql_mode & MODE_NO_ZERO_DATE &&
!sql_field->def &&
sql_field->sql_type == MYSQL_TYPE_TIMESTAMP &&
(sql_field->flags & NOT_NULL_FLAG) &&
(type == Field::NONE || type == Field::TIMESTAMP_UN_FIELD))
{
/*
An error should be reported if:
- NO_ZERO_DATE SQL mode is active;
- there is no explicit DEFAULT clause (default column value);
- this is a TIMESTAMP column;
- the column is not NULL;
- this is not the DEFAULT CURRENT_TIMESTAMP column.
In other words, an error should be reported if
- NO_ZERO_DATE SQL mode is active;
- the column definition is equivalent to
'column_name TIMESTAMP DEFAULT 0'.
*/
my_error(ER_INVALID_DEFAULT, MYF(0), sql_field->field_name);
DBUG_RETURN(TRUE);
}
}
DBUG_RETURN(FALSE);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment