/**
* {@inheritDoc}
*/
protected Column readColumn(DatabaseMetaDataWrapper metaData, Map values) throws SQLException
{
Column column = super.readColumn(metaData, values);
if (column.getDefaultValue() != null)
{
// Oracle pads the default value with spaces
column.setDefaultValue(column.getDefaultValue().trim());
}
if (column.getTypeCode() == Types.DECIMAL)
{
// We're back-mapping the NUMBER columns returned by Oracle
// Note that the JDBC driver returns DECIMAL for these NUMBER columns
switch (column.getSizeAsInt())
{
case 1:
if (column.getScale() == 0)
{
column.setTypeCode(Types.BIT);
}
break;
case 3:
if (column.getScale() == 0)
{
column.setTypeCode(Types.TINYINT);
}
break;
case 5:
if (column.getScale() == 0)
{
column.setTypeCode(Types.SMALLINT);
}
break;
case 18:
column.setTypeCode(Types.REAL);
break;
case 22:
if (column.getScale() == 0)
{
column.setTypeCode(Types.INTEGER);
}
break;
case 38:
if (column.getScale() == 0)
{
column.setTypeCode(Types.BIGINT);
}
else
{
column.setTypeCode(Types.DOUBLE);
}
break;
}
}
else if (column.getTypeCode() == Types.FLOAT)
{
// Same for REAL, FLOAT, DOUBLE PRECISION, which all back-map to FLOAT but with
// different sizes (63 for REAL, 126 for FLOAT/DOUBLE PRECISION)
switch (column.getSizeAsInt())
{
case 63:
column.setTypeCode(Types.REAL);
break;
case 126:
column.setTypeCode(Types.DOUBLE);
break;
}
}
else if ((column.getTypeCode() == Types.DATE) || (column.getTypeCode() == Types.TIMESTAMP))
{
// Oracle has only one DATE/TIME type, so we can't know which it is and thus map
// it back to TIMESTAMP
column.setTypeCode(Types.TIMESTAMP);
// we also reverse the ISO-format adaptation, and adjust the default value to timestamp
if (column.getDefaultValue() != null)
{
PatternMatcher matcher = new Perl5Matcher();
Timestamp timestamp = null;
if (matcher.matches(column.getDefaultValue(), _oracleIsoTimestampPattern))
{
String timestampVal = matcher.getMatch().group(1);
timestamp = Timestamp.valueOf(timestampVal);
}
else if (matcher.matches(column.getDefaultValue(), _oracleIsoDatePattern))
{
String dateVal = matcher.getMatch().group(1);
timestamp = new Timestamp(Date.valueOf(dateVal).getTime());
}
else if (matcher.matches(column.getDefaultValue(), _oracleIsoTimePattern))
{
String timeVal = matcher.getMatch().group(1);
timestamp = new Timestamp(Time.valueOf(timeVal).getTime());
}
if (timestamp != null)
{
column.setDefaultValue(timestamp.toString());
}
}
}
else if (TypeMap.isTextType(column.getTypeCode()))
{
column.setDefaultValue(unescape(column.getDefaultValue(), "'", "''"));
}
return column;
}