From f440deba40632cb77f4987cb594a6cf52cafaa90 Mon Sep 17 00:00:00 2001 From: Evgenij Ryazanov Date: Sat, 5 Jun 2021 13:05:19 +0800 Subject: [PATCH] Get rid of ValueLob.getPrecision() --- .../main/org/h2/mvstore/db/LobStorageMap.java | 2 +- .../main/org/h2/mvstore/db/ValueDataType.java | 25 +++++++++++++++---- h2/src/main/org/h2/tools/Recover.java | 4 ++- h2/src/main/org/h2/util/JdbcUtils.java | 10 +++----- h2/src/main/org/h2/value/Transfer.java | 8 +++--- h2/src/main/org/h2/value/Value.java | 4 +-- h2/src/main/org/h2/value/ValueLob.java | 9 ------- 7 files changed, 34 insertions(+), 28 deletions(-) diff --git a/h2/src/main/org/h2/mvstore/db/LobStorageMap.java b/h2/src/main/org/h2/mvstore/db/LobStorageMap.java index bbfed9121b..71dc31ac53 100644 --- a/h2/src/main/org/h2/mvstore/db/LobStorageMap.java +++ b/h2/src/main/org/h2/mvstore/db/LobStorageMap.java @@ -232,7 +232,7 @@ public ValueLob copyLob(ValueLob old, int tableId, long length) { final LobDataDatabase lobData = (LobDataDatabase) old.getLobData(); final int type = old.getValueType(); final long oldLobId = lobData.getLobId(); - final long oldLength = old.getPrecision(); + final long oldLength = type == Value.CLOB ? old.charLength() : old.octetLength(); if (oldLength != length) { throw DbException.getInternalError("Length is different"); } diff --git a/h2/src/main/org/h2/mvstore/db/ValueDataType.java b/h2/src/main/org/h2/mvstore/db/ValueDataType.java index 2e358847ab..49b99fe569 100644 --- a/h2/src/main/org/h2/mvstore/db/ValueDataType.java +++ b/h2/src/main/org/h2/mvstore/db/ValueDataType.java @@ -54,7 +54,6 @@ import org.h2.value.ValueInterval; import org.h2.value.ValueJavaObject; import org.h2.value.ValueJson; -import org.h2.value.ValueLob; import org.h2.value.ValueNull; import org.h2.value.ValueNumeric; import org.h2.value.ValueReal; @@ -451,17 +450,33 @@ public void write(WriteBuffer buff, Value v) { } break; } - case Value.BLOB: + case Value.BLOB: { + buff.put(BLOB); + ValueBlob lob = (ValueBlob) v; + LobData lobData = lob.getLobData(); + if (lobData instanceof LobDataDatabase) { + LobDataDatabase lobDataDatabase = (LobDataDatabase) lobData; + buff.putVarInt(-3). + putVarInt(lobDataDatabase.getTableId()). + putVarLong(lobDataDatabase.getLobId()). + putVarLong(lob.octetLength()); + } else { + byte[] small = ((LobDataInMemory) lobData).getSmall(); + buff.putVarInt(small.length). + put(small); + } + break; + } case Value.CLOB: { - buff.put(type == Value.BLOB ? BLOB : CLOB); - ValueLob lob = (ValueLob) v; + buff.put(CLOB); + ValueClob lob = (ValueClob) v; LobData lobData = lob.getLobData(); if (lobData instanceof LobDataDatabase) { LobDataDatabase lobDataDatabase = (LobDataDatabase) lobData; buff.putVarInt(-3). putVarInt(lobDataDatabase.getTableId()). putVarLong(lobDataDatabase.getLobId()). - putVarLong(lob.getPrecision()); + putVarLong(lob.charLength()); } else { byte[] small = ((LobDataInMemory) lobData).getSmall(); buff.putVarInt(small.length). diff --git a/h2/src/main/org/h2/tools/Recover.java b/h2/src/main/org/h2/tools/Recover.java index c8e7769acb..bb824bace8 100644 --- a/h2/src/main/org/h2/tools/Recover.java +++ b/h2/src/main/org/h2/tools/Recover.java @@ -294,12 +294,14 @@ private void getSQL(StringBuilder builder, String column, Value v) { LobDataDatabase lobDataDatabase = (LobDataDatabase) lobData; int type = v.getValueType(); long id = lobDataDatabase.getLobId(); - long precision = lob.getPrecision(); + long precision; String columnType; if (type == Value.BLOB) { + precision = lob.octetLength(); columnType = "BLOB"; builder.append("READ_BLOB"); } else { + precision = lob.charLength(); columnType = "CLOB"; builder.append("READ_CLOB"); } diff --git a/h2/src/main/org/h2/util/JdbcUtils.java b/h2/src/main/org/h2/util/JdbcUtils.java index 7fb59888af..11cddb4e5e 100644 --- a/h2/src/main/org/h2/util/JdbcUtils.java +++ b/h2/src/main/org/h2/util/JdbcUtils.java @@ -596,14 +596,12 @@ private static void setOther(PreparedStatement prep, int parameterIndex, Value v } private static void setLob(PreparedStatement prep, int parameterIndex, ValueLob value) throws SQLException { - long p = value.getPrecision(); - if (p > Integer.MAX_VALUE) { - p = -1; - } if (value.getValueType() == Value.BLOB) { - prep.setBinaryStream(parameterIndex, value.getInputStream(), (int) p); + long p = value.octetLength(); + prep.setBinaryStream(parameterIndex, value.getInputStream(), p > Integer.MAX_VALUE ? -1 : (int) p); } else { - prep.setCharacterStream(parameterIndex, value.getReader(), (int) p); + long p = value.charLength(); + prep.setCharacterStream(parameterIndex, value.getReader(), p > Integer.MAX_VALUE ? -1 : (int) p); } } diff --git a/h2/src/main/org/h2/value/Transfer.java b/h2/src/main/org/h2/value/Transfer.java index 5eb84e9ba1..f0091b69b6 100644 --- a/h2/src/main/org/h2/value/Transfer.java +++ b/h2/src/main/org/h2/value/Transfer.java @@ -874,16 +874,16 @@ public void writeValue(Value v) throws IOException { writeInt(BLOB); ValueBlob lob = (ValueBlob) v; LobData lobData = lob.getLobData(); + long length = lob.octetLength(); if (lobData instanceof LobDataDatabase) { LobDataDatabase lobDataDatabase = (LobDataDatabase) lobData; writeLong(-1); writeInt(lobDataDatabase.getTableId()); writeLong(lobDataDatabase.getLobId()); writeBytes(calculateLobMac(lobDataDatabase.getLobId())); - writeLong(lob.getPrecision()); + writeLong(length); break; } - long length = lob.getPrecision(); if (length < 0) { throw DbException.get( ErrorCode.CONNECTION_BROKEN_1, "length=" + length); @@ -901,16 +901,16 @@ public void writeValue(Value v) throws IOException { writeInt(CLOB); ValueClob lob = (ValueClob) v; LobData lobData = lob.getLobData(); + long length = lob.charLength(); if (lobData instanceof LobDataDatabase) { LobDataDatabase lobDataDatabase = (LobDataDatabase) lobData; writeLong(-1); writeInt(lobDataDatabase.getTableId()); writeLong(lobDataDatabase.getLobId()); writeBytes(calculateLobMac(lobDataDatabase.getLobId())); - writeLong(lob.getPrecision()); + writeLong(length); break; } - long length = lob.getPrecision(); if (length < 0) { throw DbException.get( ErrorCode.CONNECTION_BROKEN_1, "length=" + length); diff --git a/h2/src/main/org/h2/value/Value.java b/h2/src/main/org/h2/value/Value.java index a7868b795c..4b7d7dca59 100644 --- a/h2/src/main/org/h2/value/Value.java +++ b/h2/src/main/org/h2/value/Value.java @@ -1296,7 +1296,7 @@ private ValueClob convertToClob(TypeInfo targetType, int conversionMode, Object if (conversionMode != CONVERT_TO) { if (conversionMode == CAST_TO) { v = v.convertPrecision(targetType.getPrecision()); - } else if (v.getPrecision() > targetType.getPrecision()) { + } else if (v.charLength() > targetType.getPrecision()) { throw v.getValueTooLongException(targetType, column); } } @@ -1400,7 +1400,7 @@ private ValueBlob convertToBlob(TypeInfo targetType, int conversionMode, Object if (conversionMode != CONVERT_TO) { if (conversionMode == CAST_TO) { v = v.convertPrecision(targetType.getPrecision()); - } else if (v.getPrecision() > targetType.getPrecision()) { + } else if (v.octetLength() > targetType.getPrecision()) { throw v.getValueTooLongException(targetType, column); } } diff --git a/h2/src/main/org/h2/value/ValueLob.java b/h2/src/main/org/h2/value/ValueLob.java index 217abceccc..174247173f 100644 --- a/h2/src/main/org/h2/value/ValueLob.java +++ b/h2/src/main/org/h2/value/ValueLob.java @@ -219,15 +219,6 @@ public int hashCode() { return hash; } - /** - * Returns the precision. - * - * @return the precision - */ - public long getPrecision() { - return precision; - } - @Override public boolean equals(Object other) { if (!(other instanceof ValueLob))