Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e4f2d4a

Browse files
committed
HHH-19974/HHH-20004 Make sql type extraction from columnDefinition pluggable
1 parent e4e2118 commit e4f2d4a

File tree

101 files changed

+1222
-281
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+1222
-281
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/CockroachLegacyDialect.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ public class CockroachLegacyDialect extends Dialect {
150150

151151
// Pre-compile and reuse pattern
152152
private static final Pattern CRDB_VERSION_PATTERN = Pattern.compile( "v[\\d]+(\\.[\\d]+)?(\\.[\\d]+)?" );
153+
154+
private static final String CHAR_KEYWORD = "char";
155+
private static final String VARCHAR_KEYWORD = "varchar";
156+
153157
protected static final DatabaseVersion DEFAULT_VERSION = DatabaseVersion.make( 19, 2 );
154158
protected final PostgreSQLDriverKind driverKind;
155159

@@ -243,6 +247,24 @@ protected String castType(int sqlTypeCode) {
243247
};
244248
}
245249

250+
@Override
251+
public String castTypeFromSqlType(String sqlType) {
252+
final String castType = super.castTypeFromSqlType( sqlType );
253+
if ( castType.regionMatches( true, 0, CHAR_KEYWORD, 0, CHAR_KEYWORD.length() )
254+
&& (castType.length() == CHAR_KEYWORD.length()
255+
|| !Character.isLetterOrDigit( castType.charAt( CHAR_KEYWORD.length() ) )) ) {
256+
return "string";
257+
}
258+
else if ( castType.regionMatches( true, 0, VARCHAR_KEYWORD, 0, VARCHAR_KEYWORD.length() )
259+
&& (castType.length() == VARCHAR_KEYWORD.length()
260+
|| !Character.isLetterOrDigit( castType.charAt( VARCHAR_KEYWORD.length() ) )) ) {
261+
return "string";
262+
}
263+
else {
264+
return castType;
265+
}
266+
}
267+
246268
@Override
247269
protected void registerColumnTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
248270
super.registerColumnTypes( typeContributions, serviceRegistry );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import org.hibernate.exception.LockAcquisitionException;
4141
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
4242
import org.hibernate.mapping.CheckConstraint;
43+
import org.hibernate.metamodel.mapping.SqlExpressible;
44+
import org.hibernate.metamodel.mapping.SqlTypedMapping;
4345
import org.hibernate.query.sqm.CastType;
4446
import org.hibernate.query.sqm.IntervalType;
4547
import org.hibernate.query.sqm.function.SqmFunctionRegistry;
@@ -1102,6 +1104,21 @@ public String getSelectClauseNullString(int sqlType, TypeConfiguration typeConfi
11021104
return "cast(null as " + castType + ")";
11031105
}
11041106

1107+
@Override
1108+
public String getSelectClauseNullString(SqlTypedMapping sqlType, TypeConfiguration typeConfiguration) {
1109+
final String castTypeName;
1110+
if ( sqlType.getSqlTypeName() != null ) {
1111+
castTypeName = sqlType.getSqlTypeName();
1112+
}
1113+
else {
1114+
final DdlTypeRegistry ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
1115+
castTypeName = ddlTypeRegistry
1116+
.getDescriptor( sqlType.getJdbcMapping().getJdbcType().getDdlTypeCode() )
1117+
.getCastTypeName( sqlType.toSize(), (SqlExpressible) sqlType.getJdbcMapping(), ddlTypeRegistry );
1118+
}
1119+
return "cast(null as " + castTypeName + ")";
1120+
}
1121+
11051122
private static String castType(DdlType descriptor) {
11061123
final String typeName = descriptor.getTypeName( Size.length( Size.DEFAULT_LENGTH ) );
11071124
//trim off the length/precision/scale

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MySQLLegacyDialect.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
import java.sql.ResultSet;
9494
import java.sql.SQLException;
9595
import java.sql.Types;
96+
import java.util.Locale;
9697

9798
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
9899
import static org.hibernate.type.SqlTypes.BIGINT;
@@ -321,6 +322,43 @@ protected String castType(int sqlTypeCode) {
321322
return super.castType( sqlTypeCode );
322323
}
323324

325+
@Override
326+
public String castTypeFromSqlType(String sqlType) {
327+
final String castType = super.castTypeFromSqlType( sqlType );
328+
final String lowerCastType = castType.toLowerCase( Locale.ROOT );
329+
final int parenthesisIndex = lowerCastType.indexOf( '(' );
330+
final String castMappingSource = parenthesisIndex == -1
331+
? lowerCastType.trim()
332+
: lowerCastType.substring( 0, parenthesisIndex ).trim();
333+
return switch ( castMappingSource ) {
334+
case "bit" -> "unsigned";
335+
336+
case "tinyint", "smallint", "integer", "bigint" -> "signed";
337+
338+
case "char", "varchar" -> {
339+
final String baseType = "char" + (parenthesisIndex == -1 ? ""
340+
: castType.substring( parenthesisIndex, castType.indexOf( ')', parenthesisIndex ) + 1 ));
341+
yield baseType + (lowerCastType.contains( "utf8mb4" ) ? " character set utf8mb4" : "");
342+
}
343+
case "mediumtext", "text", "longtext" ->
344+
lowerCastType.contains( "utf8mb4" ) ? "char character set utf8mb4" : "char";
345+
346+
case "enum" -> "char";
347+
348+
case "binary", "varbinary" -> "binary" + (parenthesisIndex == -1 ? ""
349+
: castType.substring( parenthesisIndex, castType.indexOf( ')', parenthesisIndex ) + 1 ));
350+
351+
case "tinyblob", "mediumblob", "blob", "longblob" -> "binary";
352+
353+
case "real", "float" -> getMySQLVersion().isSameOrAfter( 8, 0, 17 )
354+
? castType : "decimal(8," + Size.DEFAULT_SCALE + ")";
355+
case "double precision" -> getMySQLVersion().isSameOrAfter( 8, 0, 17 )
356+
? castType : "decimal(17," + Size.DEFAULT_SCALE + ")";
357+
358+
default -> castType;
359+
};
360+
}
361+
324362
@Override
325363
protected void registerColumnTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) {
326364
super.registerColumnTypes( typeContributions, serviceRegistry );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/OracleLegacyDialect.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ public class OracleLegacyDialect extends Dialect {
182182
private static final Pattern SQL_STATEMENT_TYPE_PATTERN =
183183
Pattern.compile( "^(?:/\\*.*?\\*/)?\\s*(select|insert|update|delete)\\s+.*?", CASE_INSENSITIVE );
184184

185+
private static final String DOMAIN_KEYWORD = "domain";
186+
private static final String JSON_KEYWORD = "json";
187+
185188
private static final int PARAM_LIST_SIZE_LIMIT = 1000;
186189

187190
public static final String PREFER_LONG_RAW = "hibernate.dialect.oracle.prefer_long_raw";
@@ -592,6 +595,25 @@ public String castPattern(CastType from, CastType to) {
592595
return super.castPattern(from, to);
593596
}
594597

598+
@Override
599+
public String sqlTypeFromDefinition(String columnDefinition) {
600+
final String definition = columnDefinition.trim();
601+
if ( definition.length() > DOMAIN_KEYWORD.length()
602+
&& definition.regionMatches( true, 0, DOMAIN_KEYWORD, 0, DOMAIN_KEYWORD.length() )
603+
&& Character.isWhitespace( definition.charAt( DOMAIN_KEYWORD.length() ) ) ) {
604+
return super.sqlTypeFromDefinition( definition.substring( DOMAIN_KEYWORD.length() + 1 ) );
605+
}
606+
else if ( definition.length() > JSON_KEYWORD.length()
607+
&& definition.regionMatches( true, 0, JSON_KEYWORD, 0, JSON_KEYWORD.length() )
608+
&& Character.isWhitespace( definition.charAt( JSON_KEYWORD.length() ) ) ) {
609+
// Ignore JSON options that can follow
610+
return "json";
611+
}
612+
else {
613+
return super.sqlTypeFromDefinition( definition );
614+
}
615+
}
616+
595617
/**
596618
* We minimize multiplicative factors by using seconds
597619
* (with fractional part) as the "native" precision for

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/PostgreSQLLegacyDialect.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -962,9 +962,16 @@ public String getSelectClauseNullString(int sqlType, TypeConfiguration typeConfi
962962

963963
@Override
964964
public String getSelectClauseNullString(SqlTypedMapping sqlType, TypeConfiguration typeConfiguration) {
965-
final String castTypeName = typeConfiguration.getDdlTypeRegistry()
966-
.getDescriptor( sqlType.getJdbcMapping().getJdbcType().getDdlTypeCode() )
967-
.getCastTypeName( sqlType.toSize(), (SqlExpressible) sqlType.getJdbcMapping(), typeConfiguration.getDdlTypeRegistry() );
965+
final String castTypeName;
966+
if ( sqlType.getSqlTypeName() != null ) {
967+
castTypeName = sqlType.getSqlTypeName();
968+
}
969+
else {
970+
final DdlTypeRegistry ddlTypeRegistry = typeConfiguration.getDdlTypeRegistry();
971+
castTypeName = ddlTypeRegistry
972+
.getDescriptor( sqlType.getJdbcMapping().getJdbcType().getDdlTypeCode() )
973+
.getCastTypeName( sqlType.toSize(), (SqlExpressible) sqlType.getJdbcMapping(), ddlTypeRegistry );
974+
}
968975
return "cast(null as " + castTypeName + ")";
969976
}
970977

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SingleStoreDialect.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
import java.util.Arrays;
120120
import java.util.Calendar;
121121
import java.util.Date;
122+
import java.util.Locale;
122123
import java.util.TimeZone;
123124

124125
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
@@ -733,6 +734,38 @@ protected String castType(int sqlTypeCode) {
733734
};
734735
}
735736

737+
@Override
738+
public String castTypeFromSqlType(String sqlType) {
739+
final String castType = super.castTypeFromSqlType( sqlType );
740+
final String lowerCastType = castType.toLowerCase( Locale.ROOT );
741+
final int parenthesisIndex = lowerCastType.indexOf( '(' );
742+
final String castMappingSource = parenthesisIndex == -1
743+
? lowerCastType.trim()
744+
: lowerCastType.substring( 0, parenthesisIndex ).trim();
745+
return switch ( castMappingSource ) {
746+
case "bit" -> "unsigned";
747+
748+
case "tinyint", "smallint", "integer", "bigint" -> "signed";
749+
750+
case "char", "varchar" -> {
751+
final String baseType = "char" + (parenthesisIndex == -1 ? ""
752+
: castType.substring( parenthesisIndex, castType.indexOf( ')', parenthesisIndex ) + 1 ));
753+
yield baseType + (lowerCastType.contains( "utf8" ) ? " character set utf8" : "");
754+
}
755+
case "mediumtext", "text", "longtext" ->
756+
lowerCastType.contains( "utf8" ) ? "char character set utf8" : "char";
757+
758+
case "enum" -> "char";
759+
760+
case "binary", "varbinary" -> "binary" + (parenthesisIndex == -1 ? ""
761+
: castType.substring( parenthesisIndex, castType.indexOf( ')', parenthesisIndex ) + 1 ));
762+
763+
case "tinyblob", "mediumblob", "blob", "longblob" -> "binary";
764+
765+
default -> castType;
766+
};
767+
}
768+
736769
@Override
737770
public SizeStrategy getSizeStrategy() {
738771
return sizeStrategy;

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/SingleStoreSqlAstTranslator.java

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@
66

77
import java.util.ArrayList;
88
import java.util.List;
9-
import java.util.Locale;
109

11-
import org.hibernate.dialect.Dialect;
1210
import org.hibernate.dialect.DmlTargetColumnQualifierSupport;
13-
import org.hibernate.engine.jdbc.Size;
1411
import org.hibernate.engine.spi.SessionFactoryImplementor;
1512
import org.hibernate.internal.util.collections.Stack;
1613
import org.hibernate.query.sqm.ComparisonOperator;
@@ -404,54 +401,7 @@ private boolean supportsWindowFunctions() {
404401
}
405402

406403
public static String getSqlType(CastTarget castTarget, SessionFactoryImplementor factory) {
407-
final String sqlType = getCastTypeName( castTarget, factory.getTypeConfiguration() );
408-
return getSqlType( castTarget, sqlType, factory.getJdbcServices().getDialect() );
409-
}
410-
411-
private static String getSqlType(CastTarget castTarget, String sqlType, Dialect dialect) {
412-
if ( sqlType != null ) {
413-
int parenthesesIndex = sqlType.indexOf( '(' );
414-
final String baseName = parenthesesIndex == -1 ? sqlType : sqlType.substring( 0, parenthesesIndex ).trim();
415-
switch ( baseName.toLowerCase( Locale.ROOT ) ) {
416-
case "bit":
417-
return "unsigned";
418-
case "tinyint":
419-
case "smallint":
420-
case "integer":
421-
case "bigint":
422-
return "signed";
423-
case "float":
424-
case "real":
425-
case "double precision":
426-
final int precision = castTarget.getPrecision() == null ?
427-
dialect.getDefaultDecimalPrecision() :
428-
castTarget.getPrecision();
429-
final int scale = castTarget.getScale() == null ? Size.DEFAULT_SCALE : castTarget.getScale();
430-
return "decimal(" + precision + "," + scale + ")";
431-
case "char":
432-
case "varchar":
433-
case "text":
434-
case "mediumtext":
435-
case "longtext":
436-
case "set":
437-
case "enum":
438-
if ( castTarget.getLength() == null ) {
439-
if ( castTarget.getJdbcMapping().getJdbcJavaType().getJavaType() == Character.class ) {
440-
return "char(1)";
441-
}
442-
else {
443-
return "char";
444-
}
445-
}
446-
return castTarget.getLength() > MAX_CHAR_SIZE ? "char" : "char(" + castTarget.getLength() + ")";
447-
case "binary":
448-
case "varbinary":
449-
case "mediumblob":
450-
case "longblob":
451-
return castTarget.getLength() == null ? "binary" : "binary(" + castTarget.getLength() + ")";
452-
}
453-
}
454-
return sqlType;
404+
return getCastTypeName( castTarget, factory.getJdbcServices().getDialect(), factory.getTypeConfiguration() );
455405
}
456406

457407
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/array/GaussDBArrayConcatElementFunction.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88

99
import org.hibernate.dialect.function.array.ArrayConcatElementFunction;
1010
import org.hibernate.dialect.function.array.DdlTypeHelper;
11-
import org.hibernate.engine.jdbc.Size;
12-
import org.hibernate.metamodel.mapping.JdbcMappingContainer;
13-
import org.hibernate.metamodel.mapping.SqlTypedMapping;
1411
import org.hibernate.metamodel.model.domain.ReturnableType;
1512
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
1613
import org.hibernate.sql.ast.SqlAstTranslator;
@@ -53,11 +50,9 @@ public void render(
5350
}
5451
final String elementCastType;
5552
if ( needsElementCasting( elementArgument ) ) {
56-
final JdbcMappingContainer arrayType = arrayArgument.getExpressionType();
57-
final Size size = arrayType instanceof SqlTypedMapping ? ( (SqlTypedMapping) arrayType ).toSize() : null;
5853
elementCastType = DdlTypeHelper.getCastTypeName(
5954
( (BasicPluralType<?, ?>) returnType ).getElementType(),
60-
size,
55+
walker.getSessionFactory().getJdbcServices().getDialect(),
6156
walker.getSessionFactory().getTypeConfiguration()
6257
);
6358
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/array/GaussDBArrayConstructorFunction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public void render(
4141
if ( needsArrayCasting( pluralType.getElementType() ) ) {
4242
arrayTypeName = DdlTypeHelper.getCastTypeName(
4343
returnType,
44+
walker.getSessionFactory().getJdbcServices().getDialect(),
4445
walker.getSessionFactory().getTypeConfiguration()
4546
);
4647
sqlAppender.append( "cast(" );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/array/GaussDBArrayContainsOperatorFunction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public void render(
7171
sqlAppender.append( "] as " );
7272
sqlAppender.append( DdlTypeHelper.getCastTypeName(
7373
haystackExpression.getExpressionType(),
74+
walker.getSessionFactory().getJdbcServices().getDialect(),
7475
walker.getSessionFactory().getTypeConfiguration()
7576
) );
7677
sqlAppender.append( ')' );

0 commit comments

Comments
 (0)