From 01c5149ba243b137061b00511b56dd81fdf0a94c Mon Sep 17 00:00:00 2001 From: lukaseder Date: Tue, 29 Jan 2019 11:59:24 +0100 Subject: [PATCH] [#7518] Support parsing ALTER TABLE .. DROP COLUMN IF EXISTS --- .../resources/org/jooq/web/grammar-3.12.txt | 2 +- .../main/java/org/jooq/impl/ParserImpl.java | 28 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt index fca2775b82..84172da42d 100644 --- a/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt +++ b/jOOQ-manual/src/main/resources/org/jooq/web/grammar-3.12.txt @@ -147,7 +147,7 @@ alterTableStatement = 'ALTER TABLE' [ 'IF EXISTS' ] tableName break | '(' column ')' ) | 'COMMENT' [ '=' ] stringLiteral -| 'DROP' [ 'COLUMN' ] identifier [ 'CASCADE' | 'RESTRICT' ] +| 'DROP' [ 'COLUMN' ] [ 'IF EXISTS' ] identifier [ 'CASCADE' | 'RESTRICT' ] | 'DROP CONSTRAINT' constraintName | 'RENAME' [ ( 'COLUMN' | 'INDEX' | 'CONSTRAINT' ) identifier ] ( 'TO' | 'AS' ) identifier ) diff --git a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java index 45b68efff3..b77aea504c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ParserImpl.java @@ -3360,10 +3360,10 @@ final class ParserImpl implements Parser { } private static final DDLQuery parseAlterTable(ParserContext ctx) { - boolean ifExists = parseKeywordIf(ctx, "IF EXISTS"); + boolean ifTableExists = parseKeywordIf(ctx, "IF EXISTS"); Table tableName = parseTableName(ctx); - AlterTableStep s1 = ifExists + AlterTableStep s1 = ifTableExists ? ctx.dsl.alterTableIfExists(tableName) : ctx.dsl.alterTable(tableName); @@ -3403,17 +3403,20 @@ final class ParserImpl implements Parser { } else { parseKeywordIf(ctx, "COLUMN"); + boolean ifColumnExists = parseKeywordIf(ctx, "IF EXISTS"); boolean parens = parseIf(ctx, '('); Field field = parseFieldName(ctx); List> fields = null; - while (parseIf(ctx, ',')) { - if (fields == null) { - fields = new ArrayList>(); - fields.add(field); - } + if (!ifColumnExists) { + while (parseIf(ctx, ',')) { + if (fields == null) { + fields = new ArrayList>(); + fields.add(field); + } - fields.add(parseFieldName(ctx)); + fields.add(parseFieldName(ctx)); + } } if (parens) @@ -3422,13 +3425,20 @@ final class ParserImpl implements Parser { boolean cascade = parseKeywordIf(ctx, "CASCADE"); boolean restrict = !cascade && parseKeywordIf(ctx, "RESTRICT"); - AlterTableDropStep s2 = fields == null ? s1.dropColumn(field) : s1.dropColumns(fields); + AlterTableDropStep s2 = + fields == null + ? ifColumnExists + ? s1.dropColumnIfExists(field) + : s1.dropColumn(field) + : s1.dropColumns(fields); + AlterTableFinalStep s3 = cascade ? s2.cascade() : restrict ? s2.restrict() : s2; + return s3; } }