From d83db4d52be6f656e828c8aabf1b9d27dbcbb088 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Mon, 31 Jul 2017 16:02:01 +0200 Subject: [PATCH] [#6472] Add support for ALTER TABLE .. ALTER COLUMN .. { SET | DROP } NOT NULL --- .../resources/org/jooq/web/grammar-3.10.txt | 6 ++++- .../java/org/jooq/AlterTableAlterStep.java | 12 ++++++++++ jOOQ/src/main/java/org/jooq/Clause.java | 11 +++++++++ .../java/org/jooq/impl/AlterTableImpl.java | 23 +++++++++++++++++++ .../src/main/java/org/jooq/impl/Keywords.java | 2 ++ .../main/java/org/jooq/impl/ParserImpl.java | 6 ++++- 6 files changed, 58 insertions(+), 2 deletions(-) diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt index 4077c9fe48..5c9ec7c470 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.10.txt @@ -44,7 +44,11 @@ alterTableStatement = 'ALTER TABLE' [ 'IF EXISTS' ] tableName break | 'DEFAULT' concat ) } -| ( 'ALTER' | 'MODIFY' ) [ 'COLUMN' ] identifier dataType [ [ 'NOT' ] 'NULL' ] +| ( 'ALTER' | 'MODIFY' ) [ 'COLUMN' ] identifier + ( + dataType [ [ 'NOT' ] 'NULL' ] + | ( 'SET' | 'DROP' ) 'NOT NULL' + ) | 'DROP COLUMN' identifier [ 'CASCADE' | 'RESTRICT' ] | 'DROP CONSTRAINT' constraintName | 'RENAME' [ ( 'COLUMN' | 'INDEX' | 'CONSTRAINT' ) identifier ] 'TO' identifier diff --git a/jOOQ/src/main/java/org/jooq/AlterTableAlterStep.java b/jOOQ/src/main/java/org/jooq/AlterTableAlterStep.java index 040b7876ae..1745ec4b23 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableAlterStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableAlterStep.java @@ -80,4 +80,16 @@ public interface AlterTableAlterStep { */ @Support({ CUBRID, DERBY, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE }) AlterTableFinalStep set(DataType type); + + /** + * Make the column NOT NULL. + */ + @Support({ POSTGRES }) + AlterTableFinalStep setNotNull(); + + /** + * Make the column nullable. + */ + @Support({ POSTGRES }) + AlterTableFinalStep dropNotNull(); } diff --git a/jOOQ/src/main/java/org/jooq/Clause.java b/jOOQ/src/main/java/org/jooq/Clause.java index 428f92b74c..04742f15b3 100644 --- a/jOOQ/src/main/java/org/jooq/Clause.java +++ b/jOOQ/src/main/java/org/jooq/Clause.java @@ -1067,6 +1067,17 @@ public enum Clause { */ ALTER_TABLE_ALTER_DEFAULT, + /** + * A SET NULL or DROP NULL clause within an + * {@link #ALTER_TABLE} statement. + *

+ * This clause surrounds + *

+ */ + ALTER_TABLE_ALTER_NULL, + /** * A DROP clause within an {@link #ALTER_TABLE} statement. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index dca3ef3176..b0c2abbf03 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -39,12 +39,15 @@ import static org.jooq.Clause.ALTER_TABLE; import static org.jooq.Clause.ALTER_TABLE_ADD; import static org.jooq.Clause.ALTER_TABLE_ALTER; import static org.jooq.Clause.ALTER_TABLE_ALTER_DEFAULT; +import static org.jooq.Clause.ALTER_TABLE_ALTER_NULL; import static org.jooq.Clause.ALTER_TABLE_DROP; import static org.jooq.Clause.ALTER_TABLE_RENAME; import static org.jooq.Clause.ALTER_TABLE_RENAME_COLUMN; import static org.jooq.Clause.ALTER_TABLE_RENAME_CONSTRAINT; import static org.jooq.Clause.ALTER_TABLE_RENAME_INDEX; import static org.jooq.Clause.ALTER_TABLE_TABLE; +import static org.jooq.Nullability.NOT_NULL; +import static org.jooq.Nullability.NULL; // ... // ... import static org.jooq.SQLDialect.CUBRID; @@ -73,6 +76,7 @@ import static org.jooq.impl.Keywords.K_DEFAULT; import static org.jooq.impl.Keywords.K_DROP; import static org.jooq.impl.Keywords.K_DROP_COLUMN; import static org.jooq.impl.Keywords.K_DROP_CONSTRAINT; +import static org.jooq.impl.Keywords.K_DROP_NOT_NULL; import static org.jooq.impl.Keywords.K_ELSE; import static org.jooq.impl.Keywords.K_END_IF; import static org.jooq.impl.Keywords.K_EXCEPTION; @@ -93,6 +97,7 @@ import static org.jooq.impl.Keywords.K_RENAME_TO; import static org.jooq.impl.Keywords.K_SET; import static org.jooq.impl.Keywords.K_SET_DATA_TYPE; import static org.jooq.impl.Keywords.K_SET_DEFAULT; +import static org.jooq.impl.Keywords.K_SET_NOT_NULL; import static org.jooq.impl.Keywords.K_THEN; import static org.jooq.impl.Keywords.K_TO; import static org.jooq.impl.Keywords.K_TYPE; @@ -163,6 +168,7 @@ final class AlterTableImpl extends AbstractQuery implements private Field alterColumn; + private Nullability alterColumnNullability; private DataType alterColumnType; private Field alterColumnDefault; private Field dropColumn; @@ -389,6 +395,18 @@ final class AlterTableImpl extends AbstractQuery implements return this; } + @Override + public final AlterTableImpl setNotNull() { + alterColumnNullability = NOT_NULL; + return this; + } + + @Override + public final AlterTableImpl dropNotNull() { + alterColumnNullability = NULL; + return this; + } + @Override public final AlterTableImpl defaultValue(Object literal) { return defaultValue(Tools.field(literal)); @@ -781,6 +799,11 @@ final class AlterTableImpl extends AbstractQuery implements ctx.sql(' ').visit(alterColumnDefault) .end(ALTER_TABLE_ALTER_DEFAULT); } + else if (alterColumnNullability != null) { + ctx.start(ALTER_TABLE_ALTER_NULL) + .sql(' ').visit(alterColumnNullability.nullable() ? K_DROP_NOT_NULL : K_SET_NOT_NULL) + .end(ALTER_TABLE_ALTER_NULL); + } ctx.end(ALTER_TABLE_ALTER); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Keywords.java b/jOOQ/src/main/java/org/jooq/impl/Keywords.java index 15d8915a1c..1817dfa3bc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Keywords.java +++ b/jOOQ/src/main/java/org/jooq/impl/Keywords.java @@ -100,6 +100,7 @@ final class Keywords { static final Keyword K_DROP_COLUMN = keyword("drop column"); static final Keyword K_DROP_CONSTRAINT = keyword("drop constraint"); static final Keyword K_DROP_INDEX = keyword("drop index"); + static final Keyword K_DROP_NOT_NULL = keyword("drop not null"); static final Keyword K_DROP_SCHEMA = keyword("drop schema"); static final Keyword K_DROP_TABLE = keyword("drop table"); static final Keyword K_DROP_VIEW = keyword("drop view"); @@ -228,6 +229,7 @@ final class Keywords { static final Keyword K_SET = keyword("set"); static final Keyword K_SET_DATA_TYPE = keyword("set data type"); static final Keyword K_SET_DEFAULT = keyword("set default"); + static final Keyword K_SET_NOT_NULL = keyword("set not null"); static final Keyword K_SIBLINGS = keyword("siblings"); static final Keyword K_SKIP = keyword("skip"); static final Keyword K_SQL = keyword("sql"); diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 2493ba9221..31d50ab4bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -1758,7 +1758,11 @@ class ParserImpl implements Parser { private static final DDLQuery parseAlterTableAlterColumn(ParserContext ctx, AlterTableStep s1) { TableField field = parseFieldName(ctx); - if (parseKeywordIf(ctx, "TYPE") || parseKeywordIf(ctx, "SET DATA TYPE")) + if (parseKeywordIf(ctx, "DROP NOT NULL")) + return s1.alter(field).dropNotNull(); + else if (parseKeywordIf(ctx, "SET NOT NULL")) + return s1.alter(field).setNotNull(); + else if (parseKeywordIf(ctx, "TYPE") || parseKeywordIf(ctx, "SET DATA TYPE")) ; DataType type = parseDataType(ctx);