in empire-db/src/main/java/org/apache/empire/db/DBDatabase.java [1058:1192]
protected Object validateValue(DBTableColumn column, Object value)
{
DataType type = column.getDataType();
// Check for NULL
if (ObjectUtils.isEmpty(value))
{ // Null value
if (column.isRequired())
throw new FieldNotNullException(column);
// Null is allowed
return null;
}
// Check for Column expression
if (value instanceof DBColumnExpr)
{ DataType funcType = ((DBColumnExpr)value).getDataType();
if (!type.isCompatible(funcType))
{ // Incompatible data types
log.info("Incompatible data types in expression for column {} using function {}!", column.getName(), value.toString());
throw new FieldIllegalValueException(column, String.valueOf(value));
}
// allowed
return value;
}
// Check for Command expression
if (value instanceof DBCommandExpr)
{ List<DBColumnExpr> exprList = ((DBCommandExpr)value).getSelectExpressions();
if (exprList.size()!=1)
{ // Incompatible data types
log.info("Invalid command expression for column {} using command {}!", column.getName(), ((DBCommandExpr)value).getSelect());
throw new FieldIllegalValueException(column, ((DBCommandExpr)value).getSelect());
}
// Compare types
if (!type.isCompatible(exprList.get(0).getDataType()))
{ // Incompatible data types
log.info("Incompatible data types in expression for column {} using function {}!", column.getName(), value.toString());
throw new FieldIllegalValueException(column, String.valueOf(value));
}
// allowed
return value;
}
// Is value valid
switch (type)
{
case DATE:
// Check for LocalDate
if (value instanceof LocalDate)
break;
if (value instanceof LocalDateTime)
{ value = ((LocalDateTime)value).toLocalDate();
break;
}
case DATETIME:
case TIMESTAMP:
// Check whether value is a valid date/time value!
if (!(value instanceof LocalDateTime) && !(value instanceof Date) && !DBDatabase.SYSDATE.equals(value))
{ try {
// Parse Date
value = ObjectUtils.getDate(value);
} catch (ValueConversionException e) {
log.info("Parsing '{}' to Date failed for column {}. Message is "+e.toString(), value, column.getName());
throw new FieldIllegalValueException(column, String.valueOf(value), e.getCause());
}
}
break;
case DECIMAL:
// check enum
if (value instanceof Enum<?>)
break; // Convert later...
// check number
if (!(value instanceof java.lang.Number))
{ try
{ // Convert to Decimal
value = ObjectUtils.getValueUtils().toDecimal(value);
// throws NumberFormatException if not a number!
} catch (NumberFormatException e) {
log.info("Parsing '{}' to Decimal failed for column {}. Message is "+e.toString(), value, column.getName());
throw new FieldIllegalValueException(column, String.valueOf(value), e);
}
}
// validate Number
value = validateNumber(column, type, (Number)value);
break;
case FLOAT:
if (!(value instanceof java.lang.Number))
{ try
{ // Convert to Double
value = ObjectUtils.getValueUtils().toDouble(value);
// throws NumberFormatException if not a number!
} catch (NumberFormatException e) {
log.info("Parsing '{}' to Double failed for column {}. Message is "+e.toString(), value, column.getName());
throw new FieldIllegalValueException(column, String.valueOf(value), e);
}
}
// validate Number
value = validateNumber(column, type, (Number)value);
break;
case INTEGER:
// check enum
if (value instanceof Enum<?>)
break; // Convert later...
// check number
if (!(value instanceof java.lang.Number))
{ try
{ // Convert to Long
value = ObjectUtils.getValueUtils().toLong(value);
} catch (NumberFormatException e) {
log.info("Parsing '{}' to Integer failed for column {}. Message is "+e.toString(), value, column.getName());
throw new FieldIllegalValueException(column, String.valueOf(value), e);
}
}
// validate Number
value = validateNumber(column, type, (Number)value);
break;
case VARCHAR:
case CHAR:
// check enum
if (value instanceof Enum<?>)
break; // Convert later...
// check length
if (value.toString().length() > (int)column.getSize())
{
throw new FieldValueTooLongException(column);
}
break;
default:
if (log.isTraceEnabled())
log.trace("No column validation has been implemented for data type " + type);
break;
}
return value;
}