Skip to content

Commit dff9a24

Browse files
committed
Fix object insert bugs
1 parent 9478b77 commit dff9a24

File tree

5 files changed

+55
-0
lines changed

5 files changed

+55
-0
lines changed

integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQueryIT.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.tsfile.read.common.Field;
3535
import org.apache.tsfile.read.common.RowRecord;
3636
import org.junit.AfterClass;
37+
import org.junit.Assert;
3738
import org.junit.BeforeClass;
3839
import org.junit.Test;
3940
import org.junit.experimental.categories.Category;
@@ -274,4 +275,35 @@ public void sessionTest() {
274275
fail(e.getMessage());
275276
}
276277
}
278+
279+
@Test
280+
public void testIllegalObjectValue() {
281+
try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) {
282+
session.executeNonQueryStatement("USE " + DATABASE_NAME);
283+
try {
284+
session.executeNonQueryStatement(
285+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', 1, 'cafebabe01', 0, 100)");
286+
fail();
287+
} catch (StatementExecutionException e) {
288+
Assert.assertTrue(e.getMessage().contains("data type is not consistent"));
289+
}
290+
291+
try {
292+
session.executeNonQueryStatement(
293+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', 'test', 'cafebabe01', 0, 100)");
294+
fail();
295+
} catch (StatementExecutionException e) {
296+
Assert.assertTrue(e.getMessage().contains("data type is not consistent"));
297+
}
298+
299+
try {
300+
session.executeNonQueryStatement(
301+
"INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', X'cafebabe01', 'cafebabe01', 0, 100)");
302+
} catch (StatementExecutionException e) {
303+
Assert.assertTrue(e.getMessage().contains("data type is not consistent"));
304+
}
305+
} catch (IoTDBConnectionException | StatementExecutionException e) {
306+
fail(e.getMessage());
307+
}
308+
}
277309
}

integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBObjectInsertIT.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,16 @@ public void insertObjectTest()
127127
session.insert(tablet);
128128
tablet.reset();
129129

130+
// insert another row without object value
131+
rowIndex = tablet.getRowSize();
132+
tablet.addTimestamp(rowIndex, 2);
133+
tablet.addValue(rowIndex, 0, "1");
134+
tablet.addValue(rowIndex, 1, "5");
135+
tablet.addValue(rowIndex, 2, "3");
136+
tablet.addValue(rowIndex, 3, 37.6F);
137+
session.insert(tablet);
138+
tablet.reset();
139+
130140
try (SessionDataSet dataSet =
131141
session.executeQueryStatement("select file from object_table where time = 1")) {
132142
SessionDataSet.DataIterator iterator = dataSet.iterator();

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,9 @@ private void handleObjectValue(
469469
continue;
470470
}
471471
byte[] binary = ((Binary[]) columns[column])[j].getValues();
472+
if (binary == null || binary.length == 0) {
473+
continue;
474+
}
472475
ByteBuffer buffer = ByteBuffer.wrap(binary);
473476
boolean isEoF = buffer.get() == 1;
474477
long offset = buffer.getLong();

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowStatement.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,13 @@ public void transferType(ZoneId zoneId) throws QueryProcessException {
234234
// if the type is binary and the value is already binary, do not convert
235235
if (values[i] != null && !(dataTypes[i].isBinary() && values[i] instanceof Binary)) {
236236
values[i] = CommonUtils.parseValue(dataTypes[i], values[i].toString(), zoneId);
237+
} else if (dataTypes[i] == TSDataType.OBJECT && values[i] instanceof Binary) {
238+
if (((Binary) values[i]).getValues().length < 9
239+
|| ((Binary) values[i]).getValues()[0] != 0
240+
&& ((Binary) values[i]).getValues()[0] != 1) {
241+
throw new IllegalArgumentException(
242+
"data type is not consistent, input " + values[i] + ", registered " + dataTypes[i]);
243+
}
237244
}
238245
} catch (Exception e) {
239246
LOGGER.warn(

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/CommonUtils.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ public static Object parseValue(TSDataType dataType, String value, ZoneId zoneId
160160
}
161161
}
162162
return new Binary(parseBlobStringToByteArray(value));
163+
case OBJECT:
164+
throw new NumberFormatException(
165+
"data type is not consistent, input " + value + ", registered " + dataType);
163166
default:
164167
throw new QueryProcessException("Unsupported data type:" + dataType);
165168
}

0 commit comments

Comments
 (0)