提交 b0b3c31b authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

ALTER TABLE ALTER COLUMN SET DATA TYPE is a standard syntax

上级 56b472bd
...@@ -359,6 +359,7 @@ ALTER TABLE [ IF EXISTS ] tableName ALTER COLUMN columnName ...@@ -359,6 +359,7 @@ ALTER TABLE [ IF EXISTS ] tableName ALTER COLUMN columnName
| { SET ON UPDATE expression } | { SET ON UPDATE expression }
| { SET NOT NULL } | { SET NOT NULL }
| { DROP NOT NULL } | { SET NULL } | { DROP NOT NULL } | { SET NULL }
| { SET DATA TYPE dataType }
| { SET { VISIBLE | INVISIBLE } } | { SET { VISIBLE | INVISIBLE } }
| { DROP ON UPDATE } } | { DROP ON UPDATE } }
"," ","
...@@ -386,6 +387,8 @@ SET NOT NULL sets a column to not allow NULL. Rows may not contains NULL in this ...@@ -386,6 +387,8 @@ SET NOT NULL sets a column to not allow NULL. Rows may not contains NULL in this
DROP NOT NULL and SET NULL set a column to allow NULL. The row may not be part of a primary key. DROP NOT NULL and SET NULL set a column to allow NULL. The row may not be part of a primary key.
SET DATA TYPE changes the data type of a column.
SET INVISIBLE makes the column hidden, i.e. it will not appear in SELECT * results. SET INVISIBLE makes the column hidden, i.e. it will not appear in SELECT * results.
SET VISIBLE has the reverse effect. SET VISIBLE has the reverse effect.
......
...@@ -7277,14 +7277,11 @@ public class Parser { ...@@ -7277,14 +7277,11 @@ public class Parser {
return command; return command;
} else if (readIf("TYPE")) { } else if (readIf("TYPE")) {
// PostgreSQL compatibility // PostgreSQL compatibility
return parseAlterTableAlterColumnType(schema, tableName, return parseAlterTableAlterColumnDataType(schema, tableName, columnName, ifTableExists);
columnName, ifTableExists);
} else if (readIf("SET")) { } else if (readIf("SET")) {
if (readIf("DATA")) { if (readIf("DATA")) {
// Derby compatibility
read("TYPE"); read("TYPE");
return parseAlterTableAlterColumnType(schema, tableName, columnName, return parseAlterTableAlterColumnDataType(schema, tableName, columnName, ifTableExists);
ifTableExists);
} }
AlterTableAlterColumn command = new AlterTableAlterColumn( AlterTableAlterColumn command = new AlterTableAlterColumn(
session, schema); session, schema);
...@@ -7341,8 +7338,7 @@ public class Parser { ...@@ -7341,8 +7338,7 @@ public class Parser {
command.setSelectivity(readExpression()); command.setSelectivity(readExpression());
return command; return command;
} else { } else {
return parseAlterTableAlterColumnType(schema, tableName, return parseAlterTableAlterColumnType(schema, tableName, columnName, ifTableExists);
columnName, ifTableExists);
} }
} }
throw getSyntaxError(); throw getSyntaxError();
...@@ -7374,8 +7370,48 @@ public class Parser { ...@@ -7374,8 +7370,48 @@ public class Parser {
Column oldColumn = columnIfTableExists(schema, tableName, columnName, ifTableExists); Column oldColumn = columnIfTableExists(schema, tableName, columnName, ifTableExists);
Column newColumn = parseColumnForTable(columnName, Column newColumn = parseColumnForTable(columnName,
oldColumn == null ? true : oldColumn.isNullable(), true); oldColumn == null ? true : oldColumn.isNullable(), true);
AlterTableAlterColumn command = new AlterTableAlterColumn(session, if (readIf(CHECK)) {
schema); Expression expr = readExpression();
newColumn.addCheckConstraint(session, expr);
}
AlterTableAlterColumn command = new AlterTableAlterColumn(session, schema);
command.setTableName(tableName);
command.setIfTableExists(ifTableExists);
command.setType(CommandInterface.ALTER_TABLE_ALTER_COLUMN_CHANGE_TYPE);
command.setOldColumn(oldColumn);
command.setNewColumn(newColumn);
return command;
}
private AlterTableAlterColumn parseAlterTableAlterColumnDataType(Schema schema,
String tableName, String columnName, boolean ifTableExists) {
Column oldColumn = columnIfTableExists(schema, tableName, columnName, ifTableExists);
Column newColumn = parseColumnWithType(columnName, true);
if (oldColumn != null) {
if (!oldColumn.isNullable()) {
newColumn.setNullable(false);
}
if (!oldColumn.getVisible()) {
newColumn.setVisible(false);
}
Expression e = oldColumn.getDefaultExpression();
if (e != null) {
newColumn.setDefaultExpression(session, e);
}
e = oldColumn.getOnUpdateExpression();
if (e != null) {
newColumn.setOnUpdateExpression(session, e);
}
e = oldColumn.getCheckConstraint(session, columnName);
if (e != null) {
newColumn.addCheckConstraint(session, e);
}
String c = oldColumn.getComment();
if (c != null) {
newColumn.setComment(c);
}
}
AlterTableAlterColumn command = new AlterTableAlterColumn(session, schema);
command.setTableName(tableName); command.setTableName(tableName);
command.setIfTableExists(ifTableExists); command.setIfTableExists(ifTableExists);
command.setType(CommandInterface.ALTER_TABLE_ALTER_COLUMN_CHANGE_TYPE); command.setType(CommandInterface.ALTER_TABLE_ALTER_COLUMN_CHANGE_TYPE);
......
...@@ -47,5 +47,24 @@ ALTER TABLE TEST ALTER COLUMN T SET NULL; ...@@ -47,5 +47,24 @@ ALTER TABLE TEST ALTER COLUMN T SET NULL;
SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'T'; SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'T';
>> INT >> INT
-- SET DATA TYPE
ALTER TABLE TEST ALTER COLUMN T SET DATA TYPE BIGINT;
> ok
SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'T';
>> BIGINT
ALTER TABLE TEST ALTER COLUMN T INT INVISIBLE DEFAULT 1 ON UPDATE 2 NOT NULL COMMENT 'C' CHECK T < 100;
> ok
SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'T';
>> INT INVISIBLE DEFAULT 1 ON UPDATE 2 NOT NULL COMMENT 'C' CHECK (T < 100)
ALTER TABLE TEST ALTER COLUMN T SET DATA TYPE BIGINT;
> ok
SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'T';
>> BIGINT INVISIBLE DEFAULT 1 ON UPDATE 2 NOT NULL COMMENT 'C' CHECK (T < 100)
DROP TABLE TEST; DROP TABLE TEST;
> ok > ok
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论