提交 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 ...@@ -21,6 +21,8 @@ Change Log
<h2>Next Version (unreleased)</h2> <h2>Next Version (unreleased)</h2>
<ul> <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>Issue #570: MySQL compatibility for ALTER TABLE .. DROP INDEX
</li> </li>
<li>Issue #537: Include the COLUMN name in message "Numeric value out of range" <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). ...@@ -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>Cristan Meijer, Netherlands
</li><li>Adam McMahon, USA </li><li>Adam McMahon, USA
</li><li>F&aacute;bio Gomes Lisboa Gomes, Brasil </li><li>F&aacute;bio Gomes Lisboa Gomes, Brasil
</li><li><a href="http://tao.works">Sam Blume, Switzerland</a>
</li></ul> </li></ul>
<!-- [close] { --></div></td></tr></table><!-- } --><!-- analytics --></body></html> <!-- [close] { --></div></td></tr></table><!-- } --><!-- analytics --></body></html>
......
...@@ -344,7 +344,6 @@ See also <a href="build.html#providing_patches">Providing Patches</a>. ...@@ -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>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>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>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>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>Connection pool: 'reset session' command (delete temp tables, rollback, auto-commit true).
</li><li>Improve SQL documentation, see http://www.w3schools.com/sql/ </li><li>Improve SQL documentation, see http://www.w3schools.com/sql/
......
...@@ -5869,7 +5869,23 @@ public class Parser { ...@@ -5869,7 +5869,23 @@ public class Parser {
// MySQL compatibility // MySQL compatibility
readIf("COLUMN"); readIf("COLUMN");
String columnName = readColumnIdentifier(); 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")) { } else if (readIf("ALTER")) {
readIf("COLUMN"); readIf("COLUMN");
String columnName = readColumnIdentifier(); String columnName = readColumnIdentifier();
......
...@@ -51,6 +51,7 @@ public class TestAlter extends TestBase { ...@@ -51,6 +51,7 @@ public class TestAlter extends TestBase {
testAlterTableAddMultipleColumnsBefore(); testAlterTableAddMultipleColumnsBefore();
testAlterTableAddMultipleColumnsAfter(); testAlterTableAddMultipleColumnsAfter();
testAlterTableModifyColumn(); testAlterTableModifyColumn();
testAlterTableModifyColumnSetNull();
conn.close(); conn.close();
deleteDb(getTestName()); deleteDb(getTestName());
} }
...@@ -283,4 +284,27 @@ public class TestAlter extends TestBase { ...@@ -283,4 +284,27 @@ public class TestAlter extends TestBase {
stat.execute("insert into t values('Hello')"); stat.execute("insert into t values('Hello')");
stat.execute("drop table t"); 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论