/**
* {@inheritDoc}
*/
protected Column readColumn(DatabaseMetaDataWrapper metaData, Map values) throws SQLException
{
Column column = super.readColumn(metaData, values);
String defaultValue = column.getDefaultValue();
// Sql Server tends to surround the returned default value with one or two sets of parentheses
if (defaultValue != null)
{
while (defaultValue.startsWith("(") && defaultValue.endsWith(")"))
{
defaultValue = defaultValue.substring(1, defaultValue.length() - 1);
}
if (column.getTypeCode() == Types.TIMESTAMP)
{
// Sql Server maintains the default values for DATE/TIME jdbc types, so we have to
// migrate the default value to TIMESTAMP
PatternMatcher matcher = new Perl5Matcher();
Timestamp timestamp = null;
if (matcher.matches(defaultValue, _isoDatePattern))
{
timestamp = new Timestamp(Date.valueOf(matcher.getMatch().group(1)).getTime());
}
else if (matcher.matches(defaultValue, _isoTimePattern))
{
timestamp = new Timestamp(Time.valueOf(matcher.getMatch().group(1)).getTime());
}
if (timestamp != null)
{
defaultValue = timestamp.toString();
}
}
else if (column.getTypeCode() == Types.DECIMAL)
{
// For some reason, Sql Server 2005 always returns DECIMAL default values with a dot
// even if the scale is 0, so we remove the dot
if ((column.getScale() == 0) && defaultValue.endsWith("."))
{
defaultValue = defaultValue.substring(0, defaultValue.length() - 1);
}
}
else if (TypeMap.isTextType(column.getTypeCode()))
{
defaultValue = unescape(defaultValue, "'", "''");
}
column.setDefaultValue(defaultValue);
}
if ((column.getTypeCode() == Types.DECIMAL) && (column.getSizeAsInt() == 19) && (column.getScale() == 0))
{
column.setTypeCode(Types.BIGINT);
}
return column;
}