[jOOQ/jOOQ#11251] Add emulation support for IF [ NOT ] EXISTS to MySQL for DDL on INDEX and VIEW objects

This commit is contained in:
Lukas Eder 2023-10-04 17:26:17 +02:00
parent 5499ca8f61
commit b6c28cd906
6 changed files with 88 additions and 65 deletions

View File

@ -9428,7 +9428,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterIndexIfExists(String)
*/
@NotNull @CheckReturnValue
@Support({ H2, POSTGRES })
@Support({ H2, MARIADB, MYSQL, POSTGRES })
AlterIndexOnStep alterIndexIfExists(@Stringly.Name String index);
/**
@ -9437,7 +9437,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterIndexIfExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ H2, POSTGRES })
@Support({ H2, MARIADB, MYSQL, POSTGRES })
AlterIndexOnStep alterIndexIfExists(Name index);
/**
@ -9446,7 +9446,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterIndexIfExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ H2, POSTGRES })
@Support({ H2, MARIADB, MYSQL, POSTGRES })
AlterIndexOnStep alterIndexIfExists(Index index);
/**
@ -9626,7 +9626,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterViewIfExists(String)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, H2, POSTGRES, YUGABYTEDB })
@Support({ DUCKDB, H2, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
AlterViewStep alterViewIfExists(@Stringly.Name String view);
/**
@ -9635,7 +9635,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterViewIfExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, H2, POSTGRES, YUGABYTEDB })
@Support({ DUCKDB, H2, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
AlterViewStep alterViewIfExists(Name view);
/**
@ -9644,7 +9644,7 @@ public interface DSLContext extends Scope {
* @see DSL#alterViewIfExists(Table)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, H2, POSTGRES, YUGABYTEDB })
@Support({ DUCKDB, H2, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
AlterViewStep alterViewIfExists(Table<?> view);
/**
@ -10021,7 +10021,7 @@ public interface DSLContext extends Scope {
* @see DSL#createIndexIfNotExists(String)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createIndexIfNotExists(@Stringly.Name String index);
/**
@ -10030,7 +10030,7 @@ public interface DSLContext extends Scope {
* @see DSL#createIndexIfNotExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createIndexIfNotExists(Name index);
/**
@ -10039,7 +10039,7 @@ public interface DSLContext extends Scope {
* @see DSL#createIndexIfNotExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createIndexIfNotExists(Index index);
/**
@ -10048,7 +10048,7 @@ public interface DSLContext extends Scope {
* @see DSL#createIndexIfNotExists()
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createIndexIfNotExists();
/**
@ -10093,7 +10093,7 @@ public interface DSLContext extends Scope {
* @see DSL#createUniqueIndexIfNotExists(String)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createUniqueIndexIfNotExists(@Stringly.Name String index);
/**
@ -10102,7 +10102,7 @@ public interface DSLContext extends Scope {
* @see DSL#createUniqueIndexIfNotExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createUniqueIndexIfNotExists(Name index);
/**
@ -10111,7 +10111,7 @@ public interface DSLContext extends Scope {
* @see DSL#createUniqueIndexIfNotExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createUniqueIndexIfNotExists(Index index);
/**
@ -10120,7 +10120,7 @@ public interface DSLContext extends Scope {
* @see DSL#createUniqueIndexIfNotExists()
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
CreateIndexStep createUniqueIndexIfNotExists();
@ -11044,7 +11044,7 @@ public interface DSLContext extends Scope {
* @see DSL#dropIndexIfExists(String)
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
DropIndexOnStep dropIndexIfExists(@Stringly.Name String index);
/**
@ -11053,7 +11053,7 @@ public interface DSLContext extends Scope {
* @see DSL#dropIndexIfExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
DropIndexOnStep dropIndexIfExists(Name index);
/**
@ -11062,7 +11062,7 @@ public interface DSLContext extends Scope {
* @see DSL#dropIndexIfExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
DropIndexOnStep dropIndexIfExists(Index index);

View File

@ -152,7 +152,7 @@ implements
private static final Clause[] CLAUSES = { Clause.ALTER_INDEX };
private static final Set<SQLDialect> NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD);
private static final Set<SQLDialect> NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, MARIADB, MYSQL);
private static final Set<SQLDialect> SUPPORT_RENAME_INDEX = SQLDialect.supportedBy(DERBY);
private final boolean supportsIfExists(Context<?> ctx) {

View File

@ -251,7 +251,7 @@ implements
private static final Clause[] CLAUSES = { Clause.CREATE_INDEX };
private static final Set<SQLDialect> NO_SUPPORT_IF_NOT_EXISTS = SQLDialect.supportedUntil(DERBY, FIREBIRD);
private static final Set<SQLDialect> NO_SUPPORT_IF_NOT_EXISTS = SQLDialect.supportedUntil(DERBY, FIREBIRD, MYSQL);
private static final Set<SQLDialect> NO_SUPPORT_SORT_SPEC = SQLDialect.supportedBy(FIREBIRD);
private static final Set<SQLDialect> SUPPORT_UNNAMED_INDEX = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);
private static final Set<SQLDialect> SUPPORT_INCLUDE = SQLDialect.supportedBy(POSTGRES, YUGABYTEDB);

View File

@ -7375,7 +7375,7 @@ public class DSL {
* @see DSLContext#alterIndexIfExists(String)
*/
@NotNull @CheckReturnValue
@Support({ H2, POSTGRES })
@Support({ H2, MARIADB, MYSQL, POSTGRES })
public static org.jooq.AlterIndexOnStep alterIndexIfExists(@Stringly.Name String index) {
return dsl().alterIndexIfExists(index);
}
@ -7390,7 +7390,7 @@ public class DSL {
* @see DSLContext#alterIndexIfExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ H2, POSTGRES })
@Support({ H2, MARIADB, MYSQL, POSTGRES })
public static org.jooq.AlterIndexOnStep alterIndexIfExists(Name index) {
return dsl().alterIndexIfExists(index);
}
@ -7405,7 +7405,7 @@ public class DSL {
* @see DSLContext#alterIndexIfExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ H2, POSTGRES })
@Support({ H2, MARIADB, MYSQL, POSTGRES })
public static org.jooq.AlterIndexOnStep alterIndexIfExists(Index index) {
return dsl().alterIndexIfExists(index);
}
@ -7705,7 +7705,7 @@ public class DSL {
* @see DSLContext#alterViewIfExists(String)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, H2, POSTGRES, YUGABYTEDB })
@Support({ DUCKDB, H2, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
public static org.jooq.AlterViewStep alterViewIfExists(@Stringly.Name String view) {
return dsl().alterViewIfExists(view);
}
@ -7720,7 +7720,7 @@ public class DSL {
* @see DSLContext#alterViewIfExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, H2, POSTGRES, YUGABYTEDB })
@Support({ DUCKDB, H2, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
public static org.jooq.AlterViewStep alterViewIfExists(Name view) {
return dsl().alterViewIfExists(view);
}
@ -7735,7 +7735,7 @@ public class DSL {
* @see DSLContext#alterViewIfExists(Table)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, H2, POSTGRES, YUGABYTEDB })
@Support({ DUCKDB, H2, MARIADB, MYSQL, POSTGRES, YUGABYTEDB })
public static org.jooq.AlterViewStep alterViewIfExists(Table<?> view) {
return dsl().alterViewIfExists(view);
}
@ -8358,7 +8358,7 @@ public class DSL {
* @see DSLContext#createIndexIfNotExists(String)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createIndexIfNotExists(@Stringly.Name String index) {
return dsl().createIndexIfNotExists(index);
}
@ -8373,7 +8373,7 @@ public class DSL {
* @see DSLContext#createIndexIfNotExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createIndexIfNotExists(Name index) {
return dsl().createIndexIfNotExists(index);
}
@ -8388,7 +8388,7 @@ public class DSL {
* @see DSLContext#createIndexIfNotExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createIndexIfNotExists(Index index) {
return dsl().createIndexIfNotExists(index);
}
@ -8403,7 +8403,7 @@ public class DSL {
* @see DSLContext#createIndexIfNotExists()
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createIndexIfNotExists() {
return dsl().createIndexIfNotExists();
}
@ -8478,7 +8478,7 @@ public class DSL {
* @see DSLContext#createUniqueIndexIfNotExists(String)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createUniqueIndexIfNotExists(@Stringly.Name String index) {
return dsl().createUniqueIndexIfNotExists(index);
}
@ -8493,7 +8493,7 @@ public class DSL {
* @see DSLContext#createUniqueIndexIfNotExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createUniqueIndexIfNotExists(Name index) {
return dsl().createUniqueIndexIfNotExists(index);
}
@ -8508,7 +8508,7 @@ public class DSL {
* @see DSLContext#createUniqueIndexIfNotExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createUniqueIndexIfNotExists(Index index) {
return dsl().createUniqueIndexIfNotExists(index);
}
@ -8523,7 +8523,7 @@ public class DSL {
* @see DSLContext#createUniqueIndexIfNotExists()
*/
@NotNull @CheckReturnValue
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ DUCKDB, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.CreateIndexStep createUniqueIndexIfNotExists() {
return dsl().createUniqueIndexIfNotExists();
}
@ -10047,7 +10047,7 @@ public class DSL {
* @see DSLContext#dropIndexIfExists(String)
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.DropIndexOnStep dropIndexIfExists(@Stringly.Name String index) {
return dsl().dropIndexIfExists(index);
}
@ -10062,7 +10062,7 @@ public class DSL {
* @see DSLContext#dropIndexIfExists(Name)
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.DropIndexOnStep dropIndexIfExists(Name index) {
return dsl().dropIndexIfExists(index);
}
@ -10077,7 +10077,7 @@ public class DSL {
* @see DSLContext#dropIndexIfExists(Index)
*/
@NotNull @CheckReturnValue
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, POSTGRES, SQLITE, YUGABYTEDB })
@Support({ CUBRID, DUCKDB, FIREBIRD, H2, HSQLDB, IGNITE, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTEDB })
public static org.jooq.DropIndexOnStep dropIndexIfExists(Index index) {
return dsl().dropIndexIfExists(index);
}

View File

@ -148,7 +148,7 @@ implements
private static final Clause[] CLAUSES = { Clause.DROP_INDEX };
private static final Set<SQLDialect> NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD);
private static final Set<SQLDialect> NO_SUPPORT_IF_EXISTS = SQLDialect.supportedUntil(CUBRID, DERBY, FIREBIRD, MYSQL);
private static final Set<SQLDialect> REQUIRES_ON = SQLDialect.supportedBy(MARIADB, MYSQL);
private final boolean supportsIfExists(Context<?> ctx) {

View File

@ -5534,37 +5534,17 @@ final class Tools {
.visit(K_BEGIN).sql(' ').visit(K_END).formatIndentEnd();
});
break;
}
case MYSQL: {
}
case MARIADB: {
List<String> sqlstates = new ArrayList<>();
// if (type == CREATE_SCHEMA)
// sqlstates.add("42710");
// else if (type == CREATE_SEQUENCE)
// sqlstates.add("42710");
// else if (type == CREATE_VIEW)
// sqlstates.add("42710");
// else
// if (type == ALTER_TABLE) {
// if (TRUE.equals(container))
// sqlstates.add("42704");
//
// if (TRUE.equals(element))
// sqlstates.add("42703");
// else if (FALSE.equals(element))
// sqlstates.add("42711");
// }
// else
sqlstates.add("42S02");
begin(ctx, c -> {
for (String sqlstate : sqlstates)
c.visit(keyword("declare continue handler for sqlstate")).sql(' ').visit(DSL.inline(sqlstate)).sql(' ').visit(K_BEGIN).sql(' ').visit(K_END).sql(';').formatSeparator();
runnable.accept(c);
c.sql(';');
});
tryCatchMySQL(ctx, type, runnable);
break;
}
@ -5598,6 +5578,49 @@ final class Tools {
}
}
private static final void tryCatchMySQL(Context<?> ctx, DDLStatementType type, Consumer<? super Context<?>> runnable) {
List<String> sqlstates = new ArrayList<>();
switch (ctx.family()) {
case MARIADB:
switch (type) {
case ALTER_INDEX:
case CREATE_INDEX:
case DROP_INDEX:
sqlstates.add("42000");
break;
}
sqlstates.add("42S02");
break;
case MYSQL:
switch (type) {
case ALTER_INDEX:
case CREATE_INDEX:
case DROP_INDEX:
sqlstates.add("42000");
break;
case ALTER_VIEW:
case CREATE_VIEW:
case DROP_VIEW:
sqlstates.add("42S01");
break;
}
break;
}
begin(ctx, c -> {
for (String sqlstate : sqlstates)
c.visit(keyword("declare continue handler for sqlstate")).sql(' ').visit(DSL.inline(sqlstate)).sql(' ').visit(K_BEGIN).sql(' ').visit(K_END).sql(';').formatSeparator();
runnable.accept(c);
c.sql(';');
});
}
static final void toSQLDDLTypeDeclarationForAddition(Context<?> ctx, DataType<?> type) {
boolean qualify = ctx.qualify();
toSQLDDLTypeDeclaration(ctx, type);