HHH-16360 fix schema update precision/scale handling
This commit is contained in:
parent
1390b8c781
commit
4be2762624
|
@ -954,7 +954,7 @@ public class MySQLDialect extends Dialect {
|
||||||
@Override
|
@Override
|
||||||
public String getAlterColumnTypeString(String columnName, String columnType, String columnDefinition) {
|
public String getAlterColumnTypeString(String columnName, String columnType, String columnDefinition) {
|
||||||
// no way to change just the column type, leaving other attributes intact
|
// no way to change just the column type, leaving other attributes intact
|
||||||
return "modify column " + columnName + " " + columnDefinition;
|
return "modify column " + columnName + " " + columnDefinition.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -21,6 +21,9 @@ import org.hibernate.type.descriptor.jdbc.JdbcType;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.hibernate.type.SqlTypes.isNumericOrDecimal;
|
||||||
|
import static org.hibernate.type.SqlTypes.isStringType;
|
||||||
|
|
||||||
class ColumnDefinitions {
|
class ColumnDefinitions {
|
||||||
|
|
||||||
static boolean hasMatchingType(Column column, ColumnInformation columnInformation, Metadata metadata, Dialect dialect) {
|
static boolean hasMatchingType(Column column, ColumnInformation columnInformation, Metadata metadata, Dialect dialect) {
|
||||||
|
@ -51,17 +54,30 @@ class ColumnDefinitions {
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean hasMatchingLength(Column column, ColumnInformation columnInformation, Metadata metadata, Dialect dialect) {
|
static boolean hasMatchingLength(Column column, ColumnInformation columnInformation, Metadata metadata, Dialect dialect) {
|
||||||
final int actualSize = columnInformation.getColumnSize();
|
int sqlType = columnInformation.getTypeCode();
|
||||||
if ( actualSize == 0 ) {
|
if ( isStringType( sqlType ) ) {
|
||||||
return true;
|
final int actualLength = columnInformation.getColumnSize();
|
||||||
}
|
|
||||||
else {
|
|
||||||
final Size size = column.getColumnSize( dialect, metadata );
|
final Size size = column.getColumnSize( dialect, metadata );
|
||||||
final Long requiredLength = size.getLength();
|
final Long requiredLength = size.getLength();
|
||||||
|
return requiredLength == null
|
||||||
|
|| requiredLength == actualLength;
|
||||||
|
}
|
||||||
|
else if ( isNumericOrDecimal( sqlType ) ) {
|
||||||
|
// Postgres, H2, SQL Server, and MySQL agree on the following:
|
||||||
|
final int actualPrecision = columnInformation.getColumnSize();
|
||||||
|
final int actualScale = columnInformation.getDecimalDigits();
|
||||||
|
final Size size = column.getColumnSize( dialect, metadata );
|
||||||
final Integer requiredPrecision = size.getPrecision();
|
final Integer requiredPrecision = size.getPrecision();
|
||||||
return requiredLength != null && requiredLength == actualSize
|
final Integer requiredScale = size.getScale();
|
||||||
|| requiredPrecision != null && requiredPrecision == actualSize
|
return requiredPrecision == null
|
||||||
|| requiredPrecision == null && requiredLength == null;
|
|| requiredScale == null
|
||||||
|
|| requiredScale == actualScale && requiredPrecision == actualPrecision;
|
||||||
|
}
|
||||||
|
// I would really love this to be able to change the binary
|
||||||
|
// precision of a float/double type, but there simply doesn't
|
||||||
|
// seem to be any good way to implement it
|
||||||
|
else {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -548,6 +548,27 @@ public class SqlTypes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this a type with a length, that is, is it
|
||||||
|
* some kind of character string or binary string?
|
||||||
|
* @param typeCode a JDBC type code from {@link Types}
|
||||||
|
*/
|
||||||
|
public static boolean isStringType(int typeCode) {
|
||||||
|
switch (typeCode) {
|
||||||
|
case Types.CHAR:
|
||||||
|
case Types.VARCHAR:
|
||||||
|
case Types.LONGVARCHAR:
|
||||||
|
case Types.NCHAR:
|
||||||
|
case Types.NVARCHAR:
|
||||||
|
case Types.LONGNVARCHAR:
|
||||||
|
case Types.BINARY:
|
||||||
|
case Types.VARBINARY:
|
||||||
|
case Types.LONGVARBINARY:
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Does the given JDBC type code represent some sort of
|
* Does the given JDBC type code represent some sort of
|
||||||
* character string type?
|
* character string type?
|
||||||
|
|
Loading…
Reference in New Issue