Skip to content

Commit 95e5970

Browse files
committed
Fixed issue liquibase#7415: MSSQL, SQL Anywhere: Does not quote tablespace name
1 parent fdcdd59 commit 95e5970

File tree

7 files changed

+30
-5
lines changed

7 files changed

+30
-5
lines changed

liquibase-standard/src/main/java/liquibase/database/Database.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import liquibase.statement.SqlStatement;
2727
import liquibase.structure.DatabaseObject;
2828
import liquibase.structure.core.*;
29-
import liquibase.util.SqlUtil;
3029
import liquibase.util.StringUtil;
3130

3231
import java.io.IOException;
@@ -334,6 +333,10 @@ default void addCompleteSqlToScope(String completeSql) {
334333

335334
String escapeTableName(String catalogName, String schemaName, String tableName);
336335

336+
default String escapeTablespaceName(String tablespaceName) {
337+
return escapeObjectName(tablespaceName, Tablespace.class);
338+
}
339+
337340
String escapeIndexName(String catalogName, String schemaName, String indexName);
338341

339342
String escapeObjectName(String objectName, Class<? extends DatabaseObject> objectType);

liquibase-standard/src/main/java/liquibase/database/core/MSSQLDatabase.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,20 @@ public String escapeTableName(String catalogName, String schemaName, String tabl
315315
return tableName;
316316
}
317317

318+
@Override
319+
public String escapeTablespaceName(String tablespaceName) {
320+
//
321+
// If the tablespace name has a parenthesis in it, the escape logic might mistake it for stored logic
322+
// and not add quotes. We can check for a space and the lack of a quote at the beginning and quote
323+
// it anyway.
324+
//
325+
tablespaceName = escapeObjectName(tablespaceName, Tablespace.class);
326+
if (tablespaceName != null && tablespaceName.contains(" ") && ! tablespaceName.startsWith("\"")) {
327+
tablespaceName = "\"" + tablespaceName + "\"";
328+
}
329+
return tablespaceName;
330+
}
331+
318332
@Override
319333
public boolean supportsTablespaces() {
320334
return true;

liquibase-standard/src/main/java/liquibase/sqlgenerator/core/AddPrimaryKeyGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public Sql[] generateSql(AddPrimaryKeyStatement statement, Database database, Sq
6464

6565
if ((StringUtil.trimToNull(statement.getTablespace()) != null) && database.supportsTablespaces()) {
6666
if (database instanceof MSSQLDatabase) {
67-
sql += " ON "+statement.getTablespace();
67+
sql += " ON " + database.escapeTablespaceName(statement.getTablespace());
6868
} else if ((database instanceof AbstractDb2Database) || (database instanceof SybaseASADatabase)) {
6969
//not supported
7070
} else {

liquibase-standard/src/main/java/liquibase/sqlgenerator/core/AddUniqueConstraintGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public Sql[] generateSql(AddUniqueConstraintStatement statement, Database databa
8181

8282
if ((StringUtil.trimToNull(statement.getTablespace()) != null) && database.supportsTablespaces()) {
8383
if (database instanceof MSSQLDatabase) {
84-
sql += " ON " + statement.getTablespace();
84+
sql += " ON " + database.escapeTablespaceName(statement.getTablespace());
8585
} else if ((database instanceof AbstractDb2Database) || (database instanceof SybaseASADatabase) || (database
8686
instanceof InformixDatabase)) {
8787
//not supported

liquibase-standard/src/main/java/liquibase/sqlgenerator/core/CreateIndexGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public Sql[] generateSql(CreateIndexStatement statement, Database database, SqlG
184184

185185
if ((StringUtil.trimToNull(statement.getTablespace()) != null) && database.supportsTablespaces()) {
186186
if ((database instanceof MSSQLDatabase) || (database instanceof SybaseASADatabase)) {
187-
buffer.append(" ON ").append(statement.getTablespace());
187+
buffer.append(" ON ").append(database.escapeTablespaceName(statement.getTablespace()));
188188
} else if ((database instanceof AbstractDb2Database) || (database instanceof InformixDatabase)) {
189189
buffer.append(" IN ").append(statement.getTablespace());
190190
} else {

liquibase-standard/src/main/java/liquibase/sqlgenerator/core/CreateTableGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ public Sql[] generateSql(CreateTableStatement statement, Database database, SqlG
347347

348348
if ((statement.getTablespace() != null) && database.supportsTablespaces()) {
349349
if ((database instanceof MSSQLDatabase) || (database instanceof SybaseASADatabase)) {
350-
sql += " ON " + statement.getTablespace();
350+
sql += " ON " + database.escapeTablespaceName(statement.getTablespace());
351351
} else if ((database instanceof AbstractDb2Database) || (database instanceof InformixDatabase)) {
352352
sql += " IN " + statement.getTablespace();
353353
} else {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package liquibase.structure.core;
2+
3+
import liquibase.structure.DatabaseObject;
4+
5+
/**
6+
* Marker type, solely used as type input for for escapeObjectName()
7+
*/
8+
public abstract class Tablespace implements DatabaseObject {};

0 commit comments

Comments
 (0)