Skip to content

Commit 544c1e0

Browse files
committed
HHH-15517 Fix for temporary table prefixing the qualified table name instead of just table name
1 parent 398702a commit 544c1e0

File tree

4 files changed

+60
-11
lines changed

4 files changed

+60
-11
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/naming/Identifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public boolean isQuoted() {
213213
*/
214214
public String render(Dialect dialect) {
215215
return isQuoted
216-
? dialect.openQuote() + getText() + dialect.closeQuote()
216+
? dialect.toQuotedIdentifier( getText() )
217217
: getText();
218218
}
219219

hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2360,6 +2360,22 @@ public char closeQuote() {
23602360
return '"';
23612361
}
23622362

2363+
/**
2364+
* Apply dialect-specific quoting.
2365+
*
2366+
* @param name The value to be quoted.
2367+
* @return The quoted value.
2368+
* @see #openQuote()
2369+
* @see #closeQuote()
2370+
*/
2371+
public String toQuotedIdentifier(String name) {
2372+
if ( name == null ) {
2373+
return null;
2374+
}
2375+
2376+
return openQuote() + name + closeQuote();
2377+
}
2378+
23632379
/**
23642380
* Apply dialect-specific quoting.
23652381
* <p/>

hibernate-core/src/main/java/org/hibernate/dialect/SybaseASEDialect.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,20 @@ public String applyLocksToSql(String sql, LockOptions aliasedLockOptions, Map<St
599599
return sql + new ForUpdateFragment( this, aliasedLockOptions, keyColumnNames ).toFragmentString();
600600
}
601601

602+
@Override
603+
public String toQuotedIdentifier(String name) {
604+
if ( name == null || name.isEmpty() ) {
605+
return name;
606+
}
607+
if ( name.charAt( 0 ) == '#' ) {
608+
// Temporary tables must start with a '#' character,
609+
// but Sybase doesn't support quoting of such identifiers,
610+
// so we simply don't apply quoting in this case
611+
return name;
612+
}
613+
return super.toQuotedIdentifier( name );
614+
}
615+
602616
@Override
603617
public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
604618
return EXTRACTOR;

hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTable.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414

1515
import org.hibernate.boot.model.naming.Identifier;
1616
import org.hibernate.boot.model.relational.Exportable;
17+
import org.hibernate.boot.model.relational.QualifiedNameParser;
18+
import org.hibernate.boot.model.relational.QualifiedTableName;
19+
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
1720
import org.hibernate.dialect.Dialect;
1821
import org.hibernate.id.IdentifierGenerator;
1922
import org.hibernate.id.OptimizableGenerator;
@@ -64,24 +67,38 @@ private TemporaryTable(
6467
EntityMappingType entityDescriptor,
6568
Function<String, String> temporaryTableNameAdjuster,
6669
Dialect dialect,
70+
SqlStringGenerationContext sqlStringGenerationContext,
6771
Function<TemporaryTable, List<TemporaryTableColumn>> columnInitializer) {
6872
this.entityDescriptor = entityDescriptor;
6973

7074
// The table name might be a sub-query, which is inappropriate for a temporary table name
7175
final String originalTableName = entityDescriptor.getEntityPersister().getSynchronizedQuerySpaces()[0];
72-
final String name;
73-
if ( Identifier.isQuoted( originalTableName ) ) {
74-
name = dialect.quote( temporaryTableNameAdjuster.apply( Identifier.unQuote( originalTableName ) ) );
75-
}
76-
else {
77-
name = temporaryTableNameAdjuster.apply( originalTableName );
78-
}
79-
if ( name.length() > dialect.getMaxIdentifierLength() ) {
80-
this.qualifiedTableName = name.substring( 0, dialect.getMaxIdentifierLength() );
76+
final QualifiedNameParser.NameParts nameParts = QualifiedNameParser.INSTANCE.parse( originalTableName );
77+
final QualifiedNameParser.NameParts adjustedNameParts = QualifiedNameParser.INSTANCE.parse(
78+
temporaryTableNameAdjuster.apply( nameParts.getObjectName().getText() )
79+
);
80+
final String temporaryTableName = adjustedNameParts.getObjectName().getText();
81+
final Identifier tableNameIdentifier;
82+
if ( temporaryTableName.length() > dialect.getMaxIdentifierLength() ) {
83+
tableNameIdentifier = new Identifier(
84+
temporaryTableName.substring( 0, dialect.getMaxIdentifierLength() ),
85+
nameParts.getObjectName().isQuoted()
86+
);
8187
}
8288
else {
83-
this.qualifiedTableName = name;
89+
tableNameIdentifier = new Identifier( temporaryTableName, nameParts.getObjectName().isQuoted() );
8490
}
91+
this.qualifiedTableName = sqlStringGenerationContext.format(
92+
new QualifiedTableName(
93+
adjustedNameParts.getCatalogName() != null
94+
? adjustedNameParts.getCatalogName()
95+
: nameParts.getCatalogName(),
96+
adjustedNameParts.getSchemaName() != null
97+
? adjustedNameParts.getSchemaName()
98+
: nameParts.getSchemaName(),
99+
tableNameIdentifier
100+
)
101+
);
85102
this.dialect = dialect;
86103
if ( dialect.getSupportedTemporaryTableKind() == TemporaryTableKind.PERSISTENT ) {
87104
final TypeConfiguration typeConfiguration = entityDescriptor.getEntityPersister()
@@ -123,6 +140,7 @@ public static TemporaryTable createIdTable(
123140
entityDescriptor,
124141
temporaryTableNameAdjuster,
125142
dialect,
143+
runtimeModelCreationContext.getSessionFactory().getSqlStringGenerationContext(),
126144
temporaryTable -> {
127145
final List<TemporaryTableColumn> columns = new ArrayList<>();
128146
final PersistentClass entityBinding = runtimeModelCreationContext.getBootModel()
@@ -211,6 +229,7 @@ public static TemporaryTable createEntityTable(
211229
entityDescriptor,
212230
temporaryTableNameAdjuster,
213231
dialect,
232+
runtimeModelCreationContext.getSessionFactory().getSqlStringGenerationContext(),
214233
temporaryTable -> {
215234
final List<TemporaryTableColumn> columns = new ArrayList<>();
216235
final PersistentClass entityBinding = runtimeModelCreationContext.getBootModel()

0 commit comments

Comments
 (0)