Skip to content

Commit 48a425f

Browse files
committed
HHH-16516 test for automatic quoting
1 parent 297db57 commit 48a425f

File tree

3 files changed

+65
-34
lines changed

3 files changed

+65
-34
lines changed

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

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package org.hibernate.boot.model.naming;
66

77
import java.util.Locale;
8+
import java.util.Objects;
89

910
import org.hibernate.dialect.Dialect;
1011

@@ -112,6 +113,7 @@ else if ( quoteOnNonIdentifierChar && !quote ) {
112113
else {
113114
for ( int i = start + 1; i < end; i++ ) {
114115
c = text.charAt( i );
116+
// every database except HSQLDB also allows a $ here
115117
if ( !isLetterOrDigit( c ) && c != '_' ) {
116118
quote = true;
117119
break;
@@ -236,11 +238,9 @@ public String toString() {
236238
}
237239

238240
@Override
239-
public boolean equals(Object o) {
240-
if ( !(o instanceof Identifier that) ) {
241-
return false;
242-
}
243-
return getCanonicalName().equals( that.getCanonicalName() );
241+
public boolean equals(Object object) {
242+
return object instanceof Identifier that
243+
&& getCanonicalName().equals( that.getCanonicalName() );
244244
}
245245

246246
public boolean matches(String name) {
@@ -251,16 +251,13 @@ public boolean matches(String name) {
251251

252252
@Override
253253
public int hashCode() {
254-
return isQuoted ? text.hashCode() : text.toLowerCase( Locale.ENGLISH ).hashCode();
254+
return isQuoted
255+
? text.hashCode()
256+
: text.toLowerCase( Locale.ENGLISH ).hashCode();
255257
}
256258

257259
public static boolean areEqual(Identifier id1, Identifier id2) {
258-
if ( id1 == null ) {
259-
return id2 == null;
260-
}
261-
else {
262-
return id1.equals( id2 );
263-
}
260+
return Objects.equals( id1, id2 );
264261
}
265262

266263
public static Identifier quote(Identifier identifier) {

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/NormalizingIdentifierHelperImpl.java

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -133,43 +133,46 @@ private String toMetaDataText(Identifier identifier) {
133133
throw new IllegalArgumentException( "Identifier cannot be null; bad usage" );
134134
}
135135

136+
final String text = identifier.getText();
136137
if ( identifier instanceof DatabaseIdentifier ) {
137-
return identifier.getText();
138+
return text;
138139
}
139-
140-
if ( identifier.isQuoted() ) {
141-
switch ( quotedCaseStrategy ) {
142-
case UPPER: {
143-
log.tracef( "Rendering quoted identifier [%s] in upper case for use in DatabaseMetaData", identifier );
144-
return identifier.getText().toUpperCase( Locale.ROOT );
140+
else if ( identifier.isQuoted() ) {
141+
return switch ( quotedCaseStrategy ) {
142+
case UPPER -> {
143+
log.tracef( "Rendering quoted identifier [%s] in upper case for use in DatabaseMetaData",
144+
identifier );
145+
yield text.toUpperCase( Locale.ROOT );
145146
}
146-
case LOWER: {
147-
log.tracef( "Rendering quoted identifier [%s] in lower case for use in DatabaseMetaData", identifier );
148-
return identifier.getText().toLowerCase( Locale.ROOT );
147+
case LOWER -> {
148+
log.tracef( "Rendering quoted identifier [%s] in lower case for use in DatabaseMetaData",
149+
identifier );
150+
yield text.toLowerCase( Locale.ROOT );
149151
}
150-
default: {
152+
default -> {
151153
// default is mixed case
152-
log.tracef( "Rendering quoted identifier [%s] in mixed case for use in DatabaseMetaData", identifier );
153-
return identifier.getText();
154+
log.tracef( "Rendering quoted identifier [%s] in mixed case for use in DatabaseMetaData",
155+
identifier );
156+
yield text;
154157
}
155-
}
158+
};
156159
}
157160
else {
158-
switch ( unquotedCaseStrategy ) {
159-
case MIXED: {
161+
return switch ( unquotedCaseStrategy ) {
162+
case MIXED -> {
160163
log.tracef( "Rendering unquoted identifier [%s] in mixed case for use in DatabaseMetaData", identifier );
161-
return identifier.getText();
164+
yield text;
162165
}
163-
case LOWER: {
166+
case LOWER -> {
164167
log.tracef( "Rendering unquoted identifier [%s] in lower case for use in DatabaseMetaData", identifier );
165-
return identifier.getText().toLowerCase( Locale.ROOT );
168+
yield text.toLowerCase( Locale.ROOT );
166169
}
167-
default: {
170+
default -> {
168171
// default is upper case
169172
log.tracef( "Rendering unquoted identifier [%s] in upper case for use in DatabaseMetaData", identifier );
170-
return identifier.getText().toUpperCase( Locale.ROOT );
173+
yield text.toUpperCase( Locale.ROOT );
171174
}
172-
}
175+
};
173176
}
174177
}
175178

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.mapping.autoquote;
6+
7+
import jakarta.persistence.Column;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.Id;
10+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
11+
import org.hibernate.testing.orm.junit.Jpa;
12+
import org.junit.jupiter.api.Test;
13+
14+
@Jpa(annotatedClasses = SpecialCharactersTest.Simple.class)
15+
public class SpecialCharactersTest {
16+
@Test void test(EntityManagerFactoryScope scope) {
17+
scope.getEntityManagerFactory();
18+
}
19+
@Entity static class Simple {
20+
@Id
21+
long id;
22+
@Column(name="NAME$NAME")
23+
String nameWithDollar;
24+
@Column(name="$NAME")
25+
String nameWithInitialDollar;
26+
@Column(name="NAME#NAME")
27+
String nameWithHash;
28+
@Column(name="NAME NAME")
29+
String nameWithSpace;
30+
}
31+
}

0 commit comments

Comments
 (0)