HHH-9713 - Creating an index in the database incorrectly tries to qualify the index with table name for some databases

This commit is contained in:
Steve Ebersole 2015-04-06 13:47:48 -05:00
parent b7273d93a2
commit a96385a6e0
8 changed files with 97 additions and 25 deletions

View File

@ -28,8 +28,8 @@
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class AbstractQualifiedName extends QualifiedNameParser.NameParts implements QualifiedName { public class QualifiedNameImpl extends QualifiedNameParser.NameParts implements QualifiedName {
public AbstractQualifiedName(Schema.Name schemaName, Identifier objectName) { public QualifiedNameImpl(Schema.Name schemaName, Identifier objectName) {
this( this(
schemaName.getCatalog(), schemaName.getCatalog(),
schemaName.getSchema(), schemaName.getSchema(),
@ -37,7 +37,7 @@ public AbstractQualifiedName(Schema.Name schemaName, Identifier objectName) {
); );
} }
public AbstractQualifiedName(Identifier catalogName, Identifier schemaName, Identifier objectName) { public QualifiedNameImpl(Identifier catalogName, Identifier schemaName, Identifier objectName) {
super( catalogName, schemaName, objectName ); super( catalogName, schemaName, objectName );
} }
} }

View File

@ -28,7 +28,7 @@
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class QualifiedSequenceName extends AbstractQualifiedName { public class QualifiedSequenceName extends QualifiedNameImpl {
public QualifiedSequenceName(Identifier catalogName, Identifier schemaName, Identifier sequenceName) { public QualifiedSequenceName(Identifier catalogName, Identifier schemaName, Identifier sequenceName) {
super( catalogName, schemaName, sequenceName ); super( catalogName, schemaName, sequenceName );
} }

View File

@ -28,7 +28,7 @@
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class QualifiedTableName extends AbstractQualifiedName { public class QualifiedTableName extends QualifiedNameImpl {
public QualifiedTableName(Identifier catalogName, Identifier schemaName, Identifier tableName) { public QualifiedTableName(Identifier catalogName, Identifier schemaName, Identifier tableName) {
super( catalogName, schemaName, tableName ); super( catalogName, schemaName, tableName );
} }

View File

@ -183,10 +183,10 @@ public Identifier fromMetaDataCatalogName(String catalogName) {
return null; return null;
} }
if ( jdbcEnvironment.getCurrentCatalog() == null // if ( jdbcEnvironment.getCurrentCatalog() == null
|| catalogName.equals( jdbcEnvironment.getCurrentCatalog().getText() ) ) { // || catalogName.equals( jdbcEnvironment.getCurrentCatalog().getText() ) ) {
return null; // return null;
} // }
return toIdentifierFromMetaData( catalogName ); return toIdentifierFromMetaData( catalogName );
} }
@ -227,10 +227,10 @@ public Identifier fromMetaDataSchemaName(String schemaName) {
return null; return null;
} }
if ( jdbcEnvironment.getCurrentSchema() == null // if ( jdbcEnvironment.getCurrentSchema() == null
|| schemaName.equals( jdbcEnvironment.getCurrentSchema().getText() ) ) { // || schemaName.equals( jdbcEnvironment.getCurrentSchema().getText() ) ) {
return null; // return null;
} // }
return toIdentifier( schemaName ); return toIdentifier( schemaName );
} }

View File

@ -141,7 +141,8 @@ private String determineCatalogFilter(Identifier catalog) throws SQLException {
// } // }
if ( identifierToUse == null ) { if ( identifierToUse == null ) {
return SANS_CATALOG_FILTER; return ALL_CATALOGS_FILTER;
// return SANS_CATALOG_FILTER;
} }
return determineAppropriateCapitalization( identifierToUse ); return determineAppropriateCapitalization( identifierToUse );
@ -157,7 +158,8 @@ private String determineSchemaFilter(Identifier schema) throws SQLException {
// } // }
if ( identifierToUse == null ) { if ( identifierToUse == null ) {
return SANS_SCHEMA_FILTER; return ALL_SCHEMAS_FILTER;
// return SANS_SCHEMA_FILTER;
} }
return determineAppropriateCapitalization( identifierToUse ); return determineAppropriateCapitalization( identifierToUse );
@ -196,19 +198,13 @@ else if ( extractionContext.getJdbcDatabaseMetaData().storesLowerCaseIdentifiers
public TableInformation extractTableInformation(ResultSet resultSet) throws SQLException { public TableInformation extractTableInformation(ResultSet resultSet) throws SQLException {
final Identifier catalogIdentifier = identifierHelper().fromMetaDataCatalogName( final Identifier catalogIdentifier = identifierHelper().fromMetaDataCatalogName(
resultSet.getString( resultSet.getString( "TABLE_CAT" )
"TABLE_CAT"
)
); );
final Identifier schemaIdentifier = identifierHelper().fromMetaDataSchemaName( final Identifier schemaIdentifier = identifierHelper().fromMetaDataSchemaName(
resultSet.getString( resultSet.getString( "TABLE_SCHEM" )
"TABLE_SCHEM"
)
); );
final Identifier tableIdentifier = identifierHelper().fromMetaDataObjectName( final Identifier tableIdentifier = identifierHelper().fromMetaDataObjectName(
resultSet.getString( resultSet.getString( "TABLE_NAME" )
"TABLE_NAME"
)
); );
final QualifiedTableName tableName = new QualifiedTableName( final QualifiedTableName tableName = new QualifiedTableName(
new Schema.Name( catalogIdentifier, schemaIdentifier ), new Schema.Name( catalogIdentifier, schemaIdentifier ),

View File

@ -26,6 +26,7 @@
import java.util.Iterator; import java.util.Iterator;
import org.hibernate.boot.Metadata; import org.hibernate.boot.Metadata;
import org.hibernate.boot.model.relational.QualifiedNameImpl;
import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Dialect;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
@ -53,7 +54,14 @@ public String[] getSqlCreateStrings(Index index, Metadata metadata) {
final String indexNameForCreation; final String indexNameForCreation;
if ( dialect.qualifyIndexName() ) { if ( dialect.qualifyIndexName() ) {
indexNameForCreation = StringHelper.qualify( tableName, index.getName() ); indexNameForCreation = jdbcEnvironment.getQualifiedObjectNameFormatter().format(
new QualifiedNameImpl(
index.getTable().getQualifiedTableName().getCatalogName(),
index.getTable().getQualifiedTableName().getSchemaName(),
jdbcEnvironment.getIdentifierHelper().toIdentifier( index.getName() )
),
jdbcEnvironment.getDialect()
);
} }
else { else {
indexNameForCreation = index.getName(); indexNameForCreation = index.getName();

View File

@ -33,6 +33,7 @@
import org.hibernate.mapping.Table; import org.hibernate.mapping.Table;
import org.hibernate.mapping.Table.ForeignKeyKey; import org.hibernate.mapping.Table.ForeignKeyKey;
import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.hibernate.testing.TestForIssue; import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase; import org.hibernate.testing.junit4.BaseUnitTestCase;
@ -82,4 +83,35 @@ public void basicTests() {
} }
} }
@Test
@TestForIssue( jiraKey = "HHH-9704" )
public void expandedTests() {
StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder();
StandardServiceRegistry standardRegistry = registryBuilder.build();
try {
final MetadataSources sources = new MetadataSources( standardRegistry );
sources.addAnnotatedClass( ManyToManyOwner.class );
sources.addAnnotatedClass( ManyToManyTarget.class );
final MetadataImplementor metadata = (MetadataImplementor) sources.buildMetadata();
metadata.validate();
// export the schema
new SchemaExport( metadata ).execute( false, true, false, false );
try {
// update the schema
new SchemaUpdate( metadata ).execute( false, true );
}
finally {
// drop the schema
new SchemaExport( metadata ).execute( false, true, false, false );
}
}
finally {
StandardServiceRegistryBuilder.destroy( standardRegistry );
}
}
} }

View File

@ -23,13 +23,21 @@
*/ */
package org.hibernate.test.schemaupdate; package org.hibernate.test.schemaupdate;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Table;
import org.hibernate.boot.MetadataSources; import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.hbm2ddl.SchemaUpdate; import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.hibernate.tool.hbm2ddl.Target;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase; import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -130,5 +138,33 @@ public void testSimpleColumnAddition() {
// new SchemaExport( serviceRegistry, v3cfg ).drop( false, true ); // new SchemaExport( serviceRegistry, v3cfg ).drop( false, true );
// } // }
@Test
@TestForIssue( jiraKey = "HHH-9713" )
public void testIndexCreationViaSchemaUpdate() {
MetadataImplementor metadata = (MetadataImplementor) new MetadataSources( serviceRegistry )
.addAnnotatedClass( EntityWithIndex.class )
.buildMetadata();
// export the schema
new SchemaExport( metadata ).execute( Target.EXPORT, SchemaExport.Type.CREATE );
try {
// update the schema
new SchemaUpdate( metadata ).execute( Target.EXPORT );
}
finally {
// drop the schema
new SchemaExport( metadata ).execute( Target.EXPORT, SchemaExport.Type.DROP );
}
}
@Entity( name = "EntityWithIndex" )
@Table( name = "T_Entity_With_Index",indexes = @Index( columnList = "name" ) )
public static class EntityWithIndex {
@Id
public Integer id;
public String name;
}
} }