throw newSQLException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE,
getParameterSQLType(parameterIndex));
try {
ReaderToUTF8Stream utfIn;
ParameterValueSet pvs = getParms();
// Need column width to figure out if truncation is needed
DataTypeDescriptor dtd[] = preparedStatement
.getParameterTypes();
int colWidth = dtd[parameterIndex - 1].getMaximumWidth();
// Default to max column width. This will be used to limit the
// amount of data read when operating on "lengthless" streams.
int usableLength = colWidth;
if (!lengthLess) {
// We cast the length from long to int. This wouldn't be
// appropriate if the limit of 2G-1 is decided to be increased
// at a later stage.
int intLength = (int)length;
int truncationLength = 0;
usableLength = intLength;
// Currently long varchar does not allow for truncation of
// trailing blanks.
// For char and varchar types, current mechanism of
// materializing when using streams seems fine given their max
// limits.
// This change is fix for DERBY-352: Insert of clobs using
// streams should not materialize the entire stream into memory
// In case of clobs, the truncation of trailing blanks is
// factored in when reading from the stream without
// materializing the entire stream, and so the special casing
// for clob below.
if (jdbcTypeId == Types.CLOB)
{
// It is possible that the length of the stream passed in
// is greater than the column width, in which case the data
// from the stream needs to be truncated.
// usableLength is the length of the data from stream that
// can be inserted which is min(colWidth,length) provided
// length - colWidth has trailing blanks only
// we have used intLength into which the length variable had
// been cast to an int and stored
if (intLength > colWidth) {
usableLength = colWidth;
truncationLength = intLength - usableLength;
}
}
// Create a stream with truncation.
utfIn = new ReaderToUTF8Stream(reader, usableLength,
truncationLength, getParameterSQLType(parameterIndex));
} else {
// Create a stream without exactness checks,
// but with a maximum limit.
utfIn = new ReaderToUTF8Stream(reader, colWidth,
getParameterSQLType(parameterIndex));
}
// JDBC is one-based, DBMS is zero-based.
// Note that for lengthless stream, usableLength will be
// the maximum length for the column.
// This is okay, based on the observation that
// setValue does not use the value for anything at all.
pvs.getParameterForSet(
parameterIndex - 1).setValue(utfIn, usableLength);
} catch (StandardException t) {
throw EmbedResultSet.noStateChangeException(t);
}