提交 8c69a427 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Try to check sizes of BLOBs

上级 0416d329
......@@ -188,7 +188,7 @@ public abstract class Value {
private static final BigDecimal MIN_LONG_DECIMAL =
BigDecimal.valueOf(Long.MIN_VALUE);
private static void rangeCheck(long zeroBasedOffset, long length, long dataSize) {
static void rangeCheck(long zeroBasedOffset, long length, long dataSize) {
if ((zeroBasedOffset | length) < 0 || length > dataSize - zeroBasedOffset) {
if (zeroBasedOffset < 0 || zeroBasedOffset > dataSize) {
throw DbException.getInvalidValueException("offset", zeroBasedOffset + 1);
......
......@@ -59,8 +59,11 @@ public class ValueLob extends Value {
}
}
static InputStream rangeInputStream(InputStream inputStream, long oneBasedOffset, long length) {
rangeCheckUnknown(oneBasedOffset, length);
static InputStream rangeInputStream(InputStream inputStream, long oneBasedOffset, long length, long dataSize) {
if (dataSize >= 0)
rangeCheck(oneBasedOffset - 1, length, dataSize);
else
rangeCheckUnknown(oneBasedOffset - 1, length);
try {
return new RangeInputStream(inputStream, oneBasedOffset - 1, length);
} catch (IOException e) {
......@@ -683,7 +686,12 @@ public class ValueLob extends Value {
if (fileName == null) {
return super.getInputStream(oneBasedOffset, length);
}
return rangeInputStream(getInputStream(), oneBasedOffset, length);
FileStore store = handler.openFile(fileName, "r", true);
boolean alwaysClose = SysProperties.lobCloseBetweenReads;
InputStream inputStream = new BufferedInputStream(
new FileStoreInputStream(store, handler, compressed, alwaysClose),
Constants.IO_BUFFER_SIZE);
return rangeInputStream(inputStream, oneBasedOffset, length, store.length());
}
@Override
......
......@@ -399,10 +399,25 @@ public class ValueLobDb extends Value implements Value.ValueClob,
@Override
public InputStream getInputStream(long oneBasedOffset, long length) {
long byteCount;
InputStream inputStream;
if (small != null) {
return super.getInputStream(oneBasedOffset, length);
} else if (fileName != null) {
FileStore store = handler.openFile(fileName, "r", true);
boolean alwaysClose = SysProperties.lobCloseBetweenReads;
byteCount = store.length();
inputStream = new BufferedInputStream(new FileStoreInputStream(store,
handler, false, alwaysClose), Constants.IO_BUFFER_SIZE);
} else {
byteCount = (type == Value.BLOB) ? precision : -1;
try {
inputStream = handler.getLobStorage().getInputStream(this, hmac, byteCount);
} catch (IOException e) {
throw DbException.convertIOException(e, toString());
}
}
return ValueLob.rangeInputStream(getInputStream(), oneBasedOffset, length);
return ValueLob.rangeInputStream(inputStream, oneBasedOffset, length, byteCount);
}
@Override
......
......@@ -1633,7 +1633,7 @@ public class TestResultSet extends TestBase {
byte[] got = readAllBytes(blob.getBinaryStream(101, 50002));
assertEqualsWithNull(expected, got);
assertTrue(!rs.wasNull());
// TODO assertThrows(ErrorCode.INVALID_VALUE_2, blob).getBinaryStream(0x10001, 1);
assertThrows(ErrorCode.INVALID_VALUE_2, blob).getBinaryStream(0x10001, 1);
assertThrows(ErrorCode.INVALID_VALUE_2, blob).getBinaryStream(0x10002, 0);
} finally {
blob.free();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论