From 9b5ab542d73bd6a211bebca4af251be8a79bc82f Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Sat, 5 Oct 2019 22:37:06 +1300 Subject: [PATCH] #1827 - @UniqueConstraint columnNames should be respecting ebean.allQuotedIdentifiers --- .../server/deploy/parse/AnnotationClass.java | 6 +- .../server/deploy/parse/AnnotationParser.java | 10 ++- .../deploy/parse/AnnotationClassTest.java | 65 +++++++++++++++++++ 3 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/test/java/io/ebeaninternal/server/deploy/parse/AnnotationClassTest.java diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java index 80f563c03..4982d25fd 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationClass.java @@ -134,12 +134,12 @@ public class AnnotationClass extends AnnotationParser { } for (Index index : findAnnotationsRecursive(cls, Index.class)) { - descriptor.addIndex(new IndexDefinition(index.columnNames(), index.name(), index.unique())); + descriptor.addIndex(new IndexDefinition(convertColumnNames(index.columnNames()), index.name(), index.unique())); } UniqueConstraint uc = findAnnotationRecursive(cls, UniqueConstraint.class); if (uc != null) { - descriptor.addIndex(new IndexDefinition(uc.columnNames())); + descriptor.addIndex(new IndexDefinition(convertColumnNames(uc.columnNames()))); } View view = findAnnotationRecursive(cls, View.class); @@ -150,7 +150,7 @@ public class AnnotationClass extends AnnotationParser { if (table != null) { UniqueConstraint[] uniqueConstraints = table.uniqueConstraints(); for (UniqueConstraint c : uniqueConstraints) { - descriptor.addIndex(new IndexDefinition(c.columnNames())); + descriptor.addIndex(new IndexDefinition(convertColumnNames(c.columnNames()))); } } diff --git a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java index 6ef7056ab..08cb701d7 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java +++ b/src/main/java/io/ebeaninternal/server/deploy/parse/AnnotationParser.java @@ -103,8 +103,7 @@ public abstract class AnnotationParser extends AnnotationBase { void readColumn(Column columnAnn, DeployBeanProperty prop) { if (!isEmpty(columnAnn.name())) { - String dbColumn = databasePlatform.convertQuotedIdentifiers(columnAnn.name()); - prop.setDbColumn(dbColumn); + prop.setDbColumn(databasePlatform.convertQuotedIdentifiers(columnAnn.name())); } prop.setDbInsertable(columnAnn.insertable()); @@ -138,4 +137,11 @@ public abstract class AnnotationParser extends AnnotationBase { } return groups.length == 0 || groups.length == 1 && Default.class.isAssignableFrom(groups[0]); } + + String[] convertColumnNames(String[] columnNames) { + for (int i = 0; i < columnNames.length; i++) { + columnNames[i] = databasePlatform.convertQuotedIdentifiers(columnNames[i]); + } + return columnNames; + } } diff --git a/src/test/java/io/ebeaninternal/server/deploy/parse/AnnotationClassTest.java b/src/test/java/io/ebeaninternal/server/deploy/parse/AnnotationClassTest.java new file mode 100644 index 000000000..73aa23ced --- /dev/null +++ b/src/test/java/io/ebeaninternal/server/deploy/parse/AnnotationClassTest.java @@ -0,0 +1,65 @@ +package io.ebeaninternal.server.deploy.parse; + +import io.ebean.config.ServerConfig; +import io.ebean.config.dbplatform.sqlserver.SqlServer17Platform; +import io.ebeaninternal.server.core.bootup.BootupClasses; +import io.ebeaninternal.server.deploy.meta.DeployBeanDescriptor; +import io.ebeaninternal.server.type.DefaultTypeManager; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +public class AnnotationClassTest { + + @Test + public void convertColumnNames_when_AllQuotedIdentifiersIsTrue() { + + AnnotationClass annotationClass = createAnnotationClass(sqlServerPlatform(true)); + + String[] colNames = {"Col1", "Col2"}; + + final String[] columnNames = annotationClass.convertColumnNames(colNames); + + assertThat(columnNames.length).isEqualTo(2); + assertThat(columnNames[0]).isEqualTo("[Col1]"); + assertThat(columnNames[1]).isEqualTo("[Col2]"); + } + + @Test + public void convertColumnNames_when_AllQuotedIdentifiersIsFalse() { + + AnnotationClass annotationClass = createAnnotationClass(sqlServerPlatform(false)); + + String[] colNames = {"Col1", "`Col2`", "col3"}; + + final String[] columnNames = annotationClass.convertColumnNames(colNames); + + assertThat(columnNames.length).isEqualTo(3); + assertThat(columnNames[0]).isEqualTo("Col1"); + assertThat(columnNames[1]).isEqualTo("[Col2]"); + assertThat(columnNames[2]).isEqualTo("col3"); + } + + @SuppressWarnings("unchecked") + private AnnotationClass createAnnotationClass(ServerConfig config) { + + DeployUtil deployUtil = new DeployUtil(new DefaultTypeManager(config, new BootupClasses()), config); + + DeployBeanInfo deployBeanInfo = new DeployBeanInfo(deployUtil, mock(DeployBeanDescriptor.class)); + ReadAnnotationConfig readAnnotationConfig = mock(ReadAnnotationConfig.class); + + return new AnnotationClass(deployBeanInfo, readAnnotationConfig); + } + + private ServerConfig sqlServerPlatform(boolean allQuotedIdentifiers) { + + SqlServer17Platform sqlServer17Platform = new SqlServer17Platform(); + ServerConfig config = new ServerConfig(); + config.setDatabasePlatform(sqlServer17Platform); + config.setAllQuotedIdentifiers(allQuotedIdentifiers); + + sqlServer17Platform.configure(config.getPlatformConfig()); + return config; + } +}