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

Try to check sizes of BLOBs

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