提交 ac8e3f14 authored 作者: plus33's avatar plus33

Fix for "Change not-null / null -constraint to existing column"

(MySql/ORACLE - SQL style)

Command failed silently corrupting the changed column.
Before the change (added after v1.4.196) following was observed:
 alter table T modify C int null; -- Worked as expected
 alter table T modify C null;     -- Silently corrupted column C
上级 b1378465
......@@ -21,6 +21,8 @@ Change Log
<h2>Next Version (unreleased)</h2>
<ul>
<li>Fix bug in MySQL/ORACLE-syntax silently corrupting the modified column in cases of setting the 'NULL'- or 'NOT NULL'-constraint. E.g. alter table T modify C NULL;
</li>
<li>Issue #570: MySQL compatibility for ALTER TABLE .. DROP INDEX
</li>
<li>Issue #537: Include the COLUMN name in message "Numeric value out of range"
......
......@@ -166,6 +166,7 @@ To become a donor, use PayPal (at the very bottom of the main web page).
</li><li>Cristan Meijer, Netherlands
</li><li>Adam McMahon, USA
</li><li>F&aacute;bio Gomes Lisboa Gomes, Brasil
</li><li><a href="http://tao.works">Sam Blume, Switzerland</a>
</li></ul>
<!-- [close] { --></div></td></tr></table><!-- } --><!-- analytics --></body></html>
......
......@@ -344,7 +344,6 @@ See also <a href="build.html#providing_patches">Providing Patches</a>.
</li><li>Allow to scan index backwards starting with a value (to better support ORDER BY DESC).
</li><li>Java Service Wrapper: try http://yajsw.sourceforge.net/
</li><li>Batch parameter for INSERT, UPDATE, and DELETE, and commit after each batch. See also MySQL DELETE.
</li><li>MySQL compatibility: support ALTER TABLE .. MODIFY COLUMN.
</li><li>Use a lazy and auto-close input stream (open resource when reading, close on eof).
</li><li>Connection pool: 'reset session' command (delete temp tables, rollback, auto-commit true).
</li><li>Improve SQL documentation, see http://www.w3schools.com/sql/
......
......@@ -5869,7 +5869,23 @@ public class Parser {
// MySQL compatibility
readIf("COLUMN");
String columnName = readColumnIdentifier();
return parseAlterTableAlterColumnType(schema, tableName, columnName, ifTableExists);
if ((isToken("NOT") || isToken("NULL"))) {
AlterTableAlterColumn command = new AlterTableAlterColumn(
session, schema);
command.setTableName(tableName);
command.setIfTableExists(ifTableExists);
Column column = columnIfTableExists(schema, tableName, columnName, ifTableExists);
command.setOldColumn(column);
if (readIf("NOT")) {
command.setType(CommandInterface.ALTER_TABLE_ALTER_COLUMN_NOT_NULL);
} else {
read("NULL");
command.setType(CommandInterface.ALTER_TABLE_ALTER_COLUMN_NULL);
}
return command;
} else {
return parseAlterTableAlterColumnType(schema, tableName, columnName, ifTableExists);
}
} else if (readIf("ALTER")) {
readIf("COLUMN");
String columnName = readColumnIdentifier();
......
......@@ -51,6 +51,7 @@ public class TestAlter extends TestBase {
testAlterTableAddMultipleColumnsBefore();
testAlterTableAddMultipleColumnsAfter();
testAlterTableModifyColumn();
testAlterTableModifyColumnSetNull();
conn.close();
deleteDb(getTestName());
}
......@@ -283,4 +284,27 @@ public class TestAlter extends TestBase {
stat.execute("insert into t values('Hello')");
stat.execute("drop table t");
}
/**
* Test for fix "Change not-null / null -constraint to existing column"
* (MySql/ORACLE - SQL style) that failed silently corrupting the changed
* column.<br/>
* Before the change (added after v1.4.196) following was observed:
* <pre>
* alter table T modify C int null; -- Worked as expected
* alter table T modify C null; -- Silently corrupted column C
* </pre>
*/
private void testAlterTableModifyColumnSetNull() throws SQLException {
// This worked in v1.4.196
stat.execute("create table T (C varchar not null)");
stat.execute("alter table T modify C int null");
stat.execute("insert into T values(null)");
stat.execute("drop table T");
// This failed in v1.4.196
stat.execute("create table T (C int not null)");
stat.execute("alter table T modify C null"); // Silently corrupted column C
stat.execute("insert into T values(null)"); // <- ERROR: NULL not allowed
stat.execute("drop table T");
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论