|
14 | 14 |
|
15 | 15 | import org.hibernate.boot.model.naming.Identifier;
|
16 | 16 | 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; |
17 | 20 | import org.hibernate.dialect.Dialect;
|
18 | 21 | import org.hibernate.id.IdentifierGenerator;
|
19 | 22 | import org.hibernate.id.OptimizableGenerator;
|
@@ -64,24 +67,38 @@ private TemporaryTable(
|
64 | 67 | EntityMappingType entityDescriptor,
|
65 | 68 | Function<String, String> temporaryTableNameAdjuster,
|
66 | 69 | Dialect dialect,
|
| 70 | + SqlStringGenerationContext sqlStringGenerationContext, |
67 | 71 | Function<TemporaryTable, List<TemporaryTableColumn>> columnInitializer) {
|
68 | 72 | this.entityDescriptor = entityDescriptor;
|
69 | 73 |
|
70 | 74 | // The table name might be a sub-query, which is inappropriate for a temporary table name
|
71 | 75 | 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 | + ); |
81 | 87 | }
|
82 | 88 | else {
|
83 |
| - this.qualifiedTableName = name; |
| 89 | + tableNameIdentifier = new Identifier( temporaryTableName, nameParts.getObjectName().isQuoted() ); |
84 | 90 | }
|
| 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 | + ); |
85 | 102 | this.dialect = dialect;
|
86 | 103 | if ( dialect.getSupportedTemporaryTableKind() == TemporaryTableKind.PERSISTENT ) {
|
87 | 104 | final TypeConfiguration typeConfiguration = entityDescriptor.getEntityPersister()
|
@@ -123,6 +140,7 @@ public static TemporaryTable createIdTable(
|
123 | 140 | entityDescriptor,
|
124 | 141 | temporaryTableNameAdjuster,
|
125 | 142 | dialect,
|
| 143 | + runtimeModelCreationContext.getSessionFactory().getSqlStringGenerationContext(), |
126 | 144 | temporaryTable -> {
|
127 | 145 | final List<TemporaryTableColumn> columns = new ArrayList<>();
|
128 | 146 | final PersistentClass entityBinding = runtimeModelCreationContext.getBootModel()
|
@@ -211,6 +229,7 @@ public static TemporaryTable createEntityTable(
|
211 | 229 | entityDescriptor,
|
212 | 230 | temporaryTableNameAdjuster,
|
213 | 231 | dialect,
|
| 232 | + runtimeModelCreationContext.getSessionFactory().getSqlStringGenerationContext(), |
214 | 233 | temporaryTable -> {
|
215 | 234 | final List<TemporaryTableColumn> columns = new ArrayList<>();
|
216 | 235 | final PersistentClass entityBinding = runtimeModelCreationContext.getBootModel()
|
|
0 commit comments