From f29c950c6bf4a7ae6f48b040f1ec098d173b0c52 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 3 Aug 2017 11:46:31 +0200 Subject: [PATCH] [#3805] Emulation for DB2 --- .../java/org/jooq/impl/AlterIndexImpl.java | 4 +- .../java/org/jooq/impl/AlterSequenceImpl.java | 4 +- .../java/org/jooq/impl/AlterTableImpl.java | 33 +++++++------ .../java/org/jooq/impl/AlterViewImpl.java | 4 +- .../java/org/jooq/impl/CreateIndexImpl.java | 4 +- .../java/org/jooq/impl/CreateSchemaImpl.java | 4 +- .../org/jooq/impl/CreateSequenceImpl.java | 4 +- .../java/org/jooq/impl/CreateTableImpl.java | 12 +++-- .../java/org/jooq/impl/CreateViewImpl.java | 4 +- .../java/org/jooq/impl/DropIndexImpl.java | 4 +- .../java/org/jooq/impl/DropSchemaImpl.java | 4 +- .../java/org/jooq/impl/DropSequenceImpl.java | 4 +- .../java/org/jooq/impl/DropTableImpl.java | 4 +- .../main/java/org/jooq/impl/DropViewImpl.java | 4 +- jOOQ/src/main/java/org/jooq/impl/Tools.java | 46 +++++++++++++++---- 15 files changed, 88 insertions(+), 51 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java index c74b9b3004..ffc8039faa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java @@ -123,9 +123,9 @@ final class AlterIndexImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateIfExistsBegin(ctx, DDLStatementType.ALTER_INDEX, index); + Tools.beginTryCatchIfExists(ctx, DDLStatementType.ALTER_INDEX, index); accept0(ctx); - Tools.executeImmediateIfExistsEnd(ctx, DDLStatementType.ALTER_INDEX, index); + Tools.endTryCatchIfExists(ctx, DDLStatementType.ALTER_INDEX, index); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java index f4ef02ab80..acbccb056e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java @@ -141,9 +141,9 @@ final class AlterSequenceImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateIfExistsBegin(ctx, DDLStatementType.ALTER_SEQUENCE, sequence); + Tools.beginTryCatchIfExists(ctx, DDLStatementType.ALTER_SEQUENCE, sequence); accept0(ctx); - Tools.executeImmediateIfExistsEnd(ctx, DDLStatementType.ALTER_SEQUENCE, sequence); + Tools.endTryCatchIfExists(ctx, DDLStatementType.ALTER_SEQUENCE, sequence); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index b0c2abbf03..a5c82e65b4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -81,7 +81,6 @@ 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; import static org.jooq.impl.Keywords.K_EXEC; -import static org.jooq.impl.Keywords.K_EXECUTE_IMMEDIATE; import static org.jooq.impl.Keywords.K_IF; import static org.jooq.impl.Keywords.K_IF_EXISTS; import static org.jooq.impl.Keywords.K_LIKE; @@ -94,7 +93,6 @@ import static org.jooq.impl.Keywords.K_RENAME_CONSTRAINT; import static org.jooq.impl.Keywords.K_RENAME_INDEX; import static org.jooq.impl.Keywords.K_RENAME_TABLE; 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; @@ -104,7 +102,9 @@ import static org.jooq.impl.Keywords.K_TYPE; import static org.jooq.impl.Keywords.K_USING_INDEX; import static org.jooq.impl.Keywords.K_WHEN; import static org.jooq.impl.Tools.begin; +import static org.jooq.impl.Tools.beginExecuteImmediate; import static org.jooq.impl.Tools.end; +import static org.jooq.impl.Tools.endExecuteImmediate; import static org.jooq.impl.Tools.toSQLDDLTypeDeclaration; import static org.jooq.impl.Tools.toSQLDDLTypeDeclarationForAddition; import static org.jooq.impl.Tools.DataKey.DATA_CONSTRAINT_REFERENCE; @@ -488,9 +488,9 @@ final class AlterTableImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateIfExistsBegin(ctx, DDLStatementType.ALTER_TABLE, table); + Tools.beginTryCatchIfExists(ctx, DDLStatementType.ALTER_TABLE, table); accept0(ctx); - Tools.executeImmediateIfExistsEnd(ctx, DDLStatementType.ALTER_TABLE, table); + Tools.endTryCatchIfExists(ctx, DDLStatementType.ALTER_TABLE, table); } else { accept0(ctx); @@ -544,6 +544,7 @@ final class AlterTableImpl extends AbstractQuery implements + case POSTGRES: alterColumnTypeAndNullabilityInBlock(ctx); return; @@ -769,7 +770,7 @@ final class AlterTableImpl extends AbstractQuery implements toSQLDDLTypeDeclaration(ctx, alterColumnType); // [#3805] Some databases cannot change the type and the NOT NULL constraint in a single statement - if (family != POSTGRES) + if (!asList(POSTGRES).contains(family)) switch (alterColumnType.nullability()) { case NULL: ctx.sql(' ').visit(K_NULL); @@ -934,8 +935,6 @@ final class AlterTableImpl extends AbstractQuery implements private final void alterColumnTypeAndNullabilityInBlock(Context ctx) { - boolean qualify = ctx.qualify(); - begin(ctx); @@ -976,16 +975,24 @@ final class AlterTableImpl extends AbstractQuery implements - case POSTGRES: { - // TODO [#6472] use jOOQ API here, once this is available - ctx.visit(K_ALTER_TABLE).sql(' ').visit(table).formatIndentStart().formatSeparator() - .visit(K_ALTER).sql(' ').qualify(false).visit(alterColumn).qualify(qualify).sql(' ') - .visit(alterColumnType.nullable() ? K_DROP : K_SET).sql(' ').visit(K_NOT_NULL).sql(';') - .formatIndentEnd(); + + + + + + + + + + + case POSTGRES: { + AlterTableAlterStep step = ctx.dsl().alterTable(table).alterColumn(alterColumn); + ctx.visit(alterColumnType.nullable() ? step.dropNotNull() : step.setNotNull()); break; } } + end(ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java index c752b73ce1..d752e77dc2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java @@ -126,9 +126,9 @@ final class AlterViewImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateIfExistsBegin(ctx, DDLStatementType.ALTER_VIEW, view); + Tools.beginTryCatchIfExists(ctx, DDLStatementType.ALTER_VIEW, view); accept0(ctx); - Tools.executeImmediateIfExistsEnd(ctx, DDLStatementType.ALTER_VIEW, view); + Tools.endTryCatchIfExists(ctx, DDLStatementType.ALTER_VIEW, view); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java index 80aee10e54..2b42cf60fe 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java @@ -178,9 +178,9 @@ final class CreateIndexImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifNotExists && !supportsIfNotExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.CREATE_INDEX); + Tools.beginTryCatch(ctx, DDLStatementType.CREATE_INDEX); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.CREATE_INDEX); + Tools.endTryCatch(ctx, DDLStatementType.CREATE_INDEX); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateSchemaImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateSchemaImpl.java index 4a3feeae85..f7313c7b77 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateSchemaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateSchemaImpl.java @@ -96,9 +96,9 @@ final class CreateSchemaImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifNotExists && !supportsIfNotExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.CREATE_SCHEMA); + Tools.beginTryCatch(ctx, DDLStatementType.CREATE_SCHEMA); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.CREATE_SCHEMA); + Tools.endTryCatch(ctx, DDLStatementType.CREATE_SCHEMA); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java index 181cf7876b..034eae19ca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java @@ -93,9 +93,9 @@ final class CreateSequenceImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifNotExists && !supportsIfNotExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.CREATE_SEQUENCE); + Tools.beginTryCatch(ctx, DDLStatementType.CREATE_SEQUENCE); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.CREATE_SEQUENCE); + Tools.endTryCatch(ctx, DDLStatementType.CREATE_SEQUENCE); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java index 28463b90f5..f8c26007eb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTableImpl.java @@ -57,10 +57,7 @@ import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.insertInto; import static org.jooq.impl.DSL.name; import static org.jooq.impl.Keywords.K_AS; -import static org.jooq.impl.Keywords.K_BEGIN; import static org.jooq.impl.Keywords.K_CREATE; -import static org.jooq.impl.Keywords.K_END; -import static org.jooq.impl.Keywords.K_EXECUTE_IMMEDIATE; import static org.jooq.impl.Keywords.K_GLOBAL_TEMPORARY; import static org.jooq.impl.Keywords.K_IF_NOT_EXISTS; import static org.jooq.impl.Keywords.K_ON_COMMIT_DELETE_ROWS; @@ -70,6 +67,10 @@ import static org.jooq.impl.Keywords.K_TABLE; import static org.jooq.impl.Keywords.K_TEMPORARY; import static org.jooq.impl.Keywords.K_WITH_DATA; import static org.jooq.impl.Keywords.K_WITH_NO_DATA; +import static org.jooq.impl.Tools.begin; +import static org.jooq.impl.Tools.beginExecuteImmediate; +import static org.jooq.impl.Tools.end; +import static org.jooq.impl.Tools.endExecuteImmediate; import static org.jooq.impl.Tools.DataKey.DATA_SELECT_INTO_TABLE; import java.util.ArrayList; @@ -221,9 +222,9 @@ final class CreateTableImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifNotExists && !supportsIfNotExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.CREATE_TABLE); + Tools.beginTryCatch(ctx, DDLStatementType.CREATE_TABLE); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.CREATE_TABLE); + Tools.endTryCatch(ctx, DDLStatementType.CREATE_TABLE); } else { accept0(ctx); @@ -356,6 +357,7 @@ final class CreateTableImpl extends AbstractQuery implements + private final void toSQLCreateTableName(Context ctx) { diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java index f97f36263f..b95bcb7c1b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java @@ -146,9 +146,9 @@ final class CreateViewImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifNotExists && !supportsIfNotExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.CREATE_VIEW); + Tools.beginTryCatch(ctx, DDLStatementType.CREATE_VIEW); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.CREATE_VIEW); + Tools.endTryCatch(ctx, DDLStatementType.CREATE_VIEW); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/DropIndexImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropIndexImpl.java index 49c95a6abf..e949f077c2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropIndexImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropIndexImpl.java @@ -122,9 +122,9 @@ final class DropIndexImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateIfExistsBegin(ctx, DDLStatementType.DROP_INDEX, index); + Tools.beginTryCatchIfExists(ctx, DDLStatementType.DROP_INDEX, index); accept0(ctx); - Tools.executeImmediateIfExistsEnd(ctx, DDLStatementType.DROP_INDEX, index); + Tools.endTryCatchIfExists(ctx, DDLStatementType.DROP_INDEX, index); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/DropSchemaImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropSchemaImpl.java index 8266dc3927..019e1c852d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropSchemaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropSchemaImpl.java @@ -114,9 +114,9 @@ final class DropSchemaImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.DROP_SCHEMA); + Tools.beginTryCatch(ctx, DDLStatementType.DROP_SCHEMA); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.DROP_SCHEMA); + Tools.endTryCatch(ctx, DDLStatementType.DROP_SCHEMA); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java index 3b539c8f41..c129e7b795 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java @@ -97,9 +97,9 @@ final class DropSequenceImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.DROP_SEQUENCE); + Tools.beginTryCatch(ctx, DDLStatementType.DROP_SEQUENCE); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.DROP_SEQUENCE); + Tools.endTryCatch(ctx, DDLStatementType.DROP_SEQUENCE); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/DropTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropTableImpl.java index a142c971a7..49b959e7d2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropTableImpl.java @@ -111,9 +111,9 @@ final class DropTableImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.DROP_TABLE); + Tools.beginTryCatch(ctx, DDLStatementType.DROP_TABLE); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.DROP_TABLE); + Tools.endTryCatch(ctx, DDLStatementType.DROP_TABLE); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java index 7a613bd128..678558f91a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java @@ -94,9 +94,9 @@ final class DropViewImpl extends AbstractQuery implements @Override public final void accept(Context ctx) { if (ifExists && !supportsIfExists(ctx)) { - Tools.executeImmediateBegin(ctx, DDLStatementType.DROP_VIEW); + Tools.beginTryCatch(ctx, DDLStatementType.DROP_VIEW); accept0(ctx); - Tools.executeImmediateEnd(ctx, DDLStatementType.DROP_VIEW); + Tools.endTryCatch(ctx, DDLStatementType.DROP_VIEW); } else { accept0(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 480acdcadf..ab2907dbb3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3512,12 +3512,39 @@ final class Tools { } } + /** + * Wrap a statement in an EXECUTE IMMEDIATE statement. + */ + static final void beginExecuteImmediate(Context ctx) { + switch (ctx.family()) { + + + + + + + + + case FIREBIRD: { + ctx.visit(K_EXECUTE_STATEMENT).sql(" '").stringLiteral(true).formatIndentStart().formatSeparator(); + break; + } + } + } + + /** + * Wrap a statement in an EXECUTE IMMEDIATE statement. + */ + static final void endExecuteImmediate(Context ctx) { + ctx.formatIndentEnd().formatSeparator().stringLiteral(false).sql("';"); + } + /** * Wrap a DROP .. IF EXISTS statement with * BEGIN EXECUTE IMMEDIATE '...' EXCEPTION WHEN ... END;, if * IF EXISTS is not supported. */ - static final void executeImmediateBegin(Context ctx, DDLStatementType type) { + static final void beginTryCatch(Context ctx, DDLStatementType type) { switch (ctx.family()) { @@ -3564,11 +3591,10 @@ final class Tools { - case FIREBIRD: { - ctx.visit(K_EXECUTE_STATEMENT).sql(" '").stringLiteral(true).formatIndentStart().formatSeparator(); + beginExecuteImmediate(ctx); break; } @@ -3582,7 +3608,7 @@ final class Tools { * BEGIN EXECUTE IMMEDIATE '...' EXCEPTION WHEN ... END;, if * IF EXISTS is not supported. */ - static final void executeImmediateEnd(Context ctx, DDLStatementType type) { + static final void endTryCatch(Context ctx, DDLStatementType type) { switch (ctx.family()) { @@ -3656,10 +3682,12 @@ final class Tools { + case FIREBIRD: { - ctx.formatIndentEnd().formatSeparator().stringLiteral(false).sql("';").formatSeparator() + endExecuteImmediate(ctx); + ctx.formatSeparator() .visit(K_WHEN).sql(" sqlcode -607 ").visit(K_DO).formatIndentStart().formatSeparator() .visit(K_BEGIN).sql(' ').visit(K_END).formatIndentEnd(); end(ctx); @@ -3671,7 +3699,7 @@ final class Tools { } } - static final void executeImmediateIfExistsBegin(Context ctx, DDLStatementType type, QueryPart object) { + static final void beginTryCatchIfExists(Context ctx, DDLStatementType type, QueryPart object) { switch (ctx.family()) { @@ -3756,12 +3784,12 @@ final class Tools { default: - executeImmediateBegin(ctx, type); + beginTryCatch(ctx, type); break; } } - static final void executeImmediateIfExistsEnd(Context ctx, DDLStatementType type, QueryPart object) { + static final void endTryCatchIfExists(Context ctx, DDLStatementType type, QueryPart object) { switch (ctx.family()) { @@ -3774,7 +3802,7 @@ final class Tools { default: - executeImmediateEnd(ctx, type); + endTryCatch(ctx, type); break; } }