This is an automated email from the ASF dual-hosted git repository. jiangtian pushed a commit to branch revert_write_time_onlt in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit a4bf7d84f2dcbdd4f9988964f4c50ddb153bbcaa Author: Tian Jiang <[email protected]> AuthorDate: Thu Feb 27 09:46:27 2025 +0800 Revert "Allow to write time column only (#14703)" This reverts commit 43ed88f49093d72b4f2f24cc7ca33b075eb2c2ea. --- .../relational/it/db/it/IoTDBInsertTableIT.java | 11 +++-- .../it/session/IoTDBSessionRelationalIT.java | 34 --------------- .../iotdb/session/it/IoTDBSessionSimpleIT.java | 48 ---------------------- .../java/org/apache/iotdb/session/Session.java | 15 +++---- .../protocol/thrift/impl/ClientRPCServiceImpl.java | 2 +- .../plan/planner/plan/node/write/InsertNode.java | 2 - .../planner/plan/node/write/InsertRowNode.java | 3 -- .../node/write/RelationalInsertTabletNode.java | 8 ---- .../fetcher/TableHeaderSchemaValidator.java | 4 ++ .../plan/relational/sql/ast/InsertRows.java | 3 -- .../plan/statement/crud/InsertBaseStatement.java | 28 ++++--------- .../plan/statement/crud/InsertRowStatement.java | 3 -- .../dataregion/memtable/AbstractMemTable.java | 24 ++++++----- 13 files changed, 39 insertions(+), 146 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java index 7a997965e9c..0d003f6e442 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBInsertTableIT.java @@ -886,7 +886,13 @@ public class IoTDBInsertTableIT { // only tag st1.execute("insert into sg21(tag1) values('1')"); // only time - st1.execute("insert into sg21(time) values(1)"); + try { + st1.execute("insert into sg21(time) values(1)"); + } catch (SQLException e) { + assertEquals( + "305: [INTERNAL_SERVER_ERROR(305)] Exception occurred: \"insert into sg21(time) values(1)\". executeStatement failed. No column other than Time present, please check the request", + e.getMessage()); + } // sleep a while to avoid the same timestamp between two insertions Thread.sleep(10); // only attribute @@ -906,9 +912,6 @@ public class IoTDBInsertTableIT { assertFalse(rs1.next()); rs1 = st1.executeQuery("select time, ss1, ss2 from sg21 order by time"); - assertTrue(rs1.next()); - assertEquals(1, rs1.getLong("time")); - assertTrue(rs1.next()); rs1.getString("ss1"); assertTrue(rs1.wasNull()); diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java index 942d8ee2a70..431eb9d6d10 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java @@ -623,40 +623,6 @@ public class IoTDBSessionRelationalIT { } } - @Test - public void insertTimeOnlyTest() throws IoTDBConnectionException, StatementExecutionException { - try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) { - session.executeNonQueryStatement("USE \"db1\""); - session.executeNonQueryStatement("CREATE TABLE IF NOT EXISTS time_only (time time)"); - - List<IMeasurementSchema> schemaList = Collections.emptyList(); - final List<ColumnCategory> columnTypes = Collections.emptyList(); - - Tablet tablet = - new Tablet( - "time_only", - IMeasurementSchema.getMeasurementNameList(schemaList), - IMeasurementSchema.getDataTypeList(schemaList), - columnTypes); - - long timestamp = 0; - for (int row = 0; row < 10; row++) { - tablet.addTimestamp(row, timestamp++); - } - session.insert(tablet); - tablet.reset(); - - for (int i = 0; i < 10; i++) { - session.executeNonQueryStatement( - String.format("INSERT INTO time_only (time) VALUES (%d)", timestamp++)); - } - - SessionDataSet dataSet = session.executeQueryStatement("select count(time) from time_only"); - RowRecord rec = dataSet.next(); - assertEquals(20, rec.getFields().get(0).getLongV()); - } - } - @Test public void insertRelationalTabletWithCacheLeaderTest() throws IoTDBConnectionException, StatementExecutionException { diff --git a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java index e5bcbb169a4..4b7e5d8d9f6 100644 --- a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java @@ -48,7 +48,6 @@ import org.apache.tsfile.utils.Binary; import org.apache.tsfile.write.TsFileWriter; import org.apache.tsfile.write.record.TSRecord; import org.apache.tsfile.write.record.Tablet; -import org.apache.tsfile.write.record.Tablet.ColumnCategory; import org.apache.tsfile.write.schema.IMeasurementSchema; import org.apache.tsfile.write.schema.MeasurementSchema; import org.junit.After; @@ -1944,52 +1943,6 @@ public class IoTDBSessionSimpleIT { } } - @Test - @Category({LocalStandaloneIT.class, ClusterIT.class}) - public void insertTimeOnlyTest() throws IoTDBConnectionException, StatementExecutionException { - try (ISession session = EnvFactory.getEnv().getSessionConnection()) { - - List<IMeasurementSchema> schemaList = Collections.emptyList(); - final List<ColumnCategory> columnTypes = Collections.emptyList(); - - Tablet tablet = - new Tablet( - "root.sg1.d1", - IMeasurementSchema.getMeasurementNameList(schemaList), - IMeasurementSchema.getDataTypeList(schemaList), - columnTypes); - - long timestamp = 0; - for (int row = 0; row < 10; row++) { - tablet.addTimestamp(row, timestamp++); - } - session.insertTablet(tablet); - tablet.setDeviceId("root.sg1.d2"); - session.insertAlignedTablet(tablet); - tablet.reset(); - - try { - session.executeNonQueryStatement( - String.format("INSERT INTO root.sg1.d3 (time) VALUES (%d)", timestamp++)); - fail("Exception expected"); - } catch (StatementExecutionException e) { - assertEquals( - "701: InsertStatement should contain at least one measurement", e.getMessage()); - } - - try { - session.executeNonQueryStatement( - String.format("INSERT INTO root.sg1.d4 (time) ALIGNED VALUES (%d)", timestamp++)); - } catch (StatementExecutionException e) { - assertEquals( - "701: InsertStatement should contain at least one measurement", e.getMessage()); - } - - SessionDataSet dataSet = session.executeQueryStatement("select count(*) from root.sg1.**"); - assertFalse(dataSet.hasNext()); - } - } - @Test @Category({LocalStandaloneIT.class, ClusterIT.class}) public void insertMinMaxTimeTest() throws IoTDBConnectionException, StatementExecutionException { @@ -2153,7 +2106,6 @@ public class IoTDBSessionSimpleIT { } @Test - @Category({LocalStandaloneIT.class, ClusterIT.class}) public void testWriteRestartAndDeleteDB() throws IoTDBConnectionException, StatementExecutionException { try (ISession session = EnvFactory.getEnv().getSessionConnection()) { diff --git a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java index e35237b754a..6908cad0632 100644 --- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java +++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java @@ -2964,17 +2964,12 @@ public class Session implements ISession { TSInsertTabletReq request = new TSInsertTabletReq(); - if (tablet.getSchemas().isEmpty()) { - request.measurements = Collections.emptyList(); - request.types = Collections.emptyList(); - } else { - for (IMeasurementSchema measurementSchema : tablet.getSchemas()) { - if (measurementSchema.getMeasurementName() == null) { - throw new IllegalArgumentException("measurement should be non null value"); - } - request.addToMeasurements(measurementSchema.getMeasurementName()); - request.addToTypes(measurementSchema.getType().ordinal()); + for (IMeasurementSchema measurementSchema : tablet.getSchemas()) { + if (measurementSchema.getMeasurementName() == null) { + throw new IllegalArgumentException("measurement should be non null value"); } + request.addToMeasurements(measurementSchema.getMeasurementName()); + request.addToTypes(measurementSchema.getType().ordinal()); } request.setPrefixPath(tablet.getDeviceId()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java index 1b9b10e6c07..121f37bf2ea 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java @@ -2243,7 +2243,7 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler { // Step 1: transfer from TSInsertTabletReq to Statement InsertTabletStatement statement = StatementGenerator.createStatement(req); // return success when this statement is empty because server doesn't need to execute it - if (statement.isEmpty() && !req.isWriteToTable()) { + if (statement.isEmpty()) { return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java index 1f1c267075f..0e69264a95d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java @@ -403,8 +403,6 @@ public abstract class InsertNode extends SearchNode { idColumnIndices.add(i); } } - } else { - idColumnIndices = Collections.emptyList(); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java index bbaeeecb4e6..d62703a608c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java @@ -166,9 +166,6 @@ public class InsertRowNode extends InsertNode implements WALEntryValue { @Override public TSDataType[] getDataTypes() { - if (dataTypes == null) { - dataTypes = new TSDataType[0]; - } if (isNeedInferType) { TSDataType[] predictedDataTypes = new TSDataType[dataTypes.length]; for (int i = 0; i < dataTypes.length; i++) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java index 741bf29b83c..70321743453 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java @@ -372,12 +372,4 @@ public class RelationalInsertTabletNode extends InsertTabletNode { startOffset = endOffset; } } - - @Override - public boolean allMeasurementFailed() { - if (measurements != null && measurements.length > 0) { - return failedMeasurementNumber >= measurements.length; - } - return false; - } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java index f8417e6c596..8b47d38e1dc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableHeaderSchemaValidator.java @@ -102,6 +102,10 @@ public class TableHeaderSchemaValidator { .takeReadLock(context, SchemaLockType.VALIDATE_VS_DELETION); final List<ColumnSchema> inputColumnList = tableSchema.getColumns(); + if (inputColumnList == null || inputColumnList.isEmpty()) { + throw new IllegalArgumentException( + "No column other than Time present, please check the request"); + } // Get directly if there is a table because we do not want "addColumn" to affect // original writings TsTable table = diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/InsertRows.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/InsertRows.java index f665362edb6..c55c02da057 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/InsertRows.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/InsertRows.java @@ -143,9 +143,6 @@ public class InsertRows extends WrappedInsertStatement { @Override public List<Object[]> getAttributeValueList() { - if (insertRowStatement.getColumnCategories() == null) { - return Collections.singletonList(new Object[0]); - } List<Object> attributeValueList = new ArrayList<>(); for (int i = 0; i < insertRowStatement.getColumnCategories().length; i++) { if (insertRowStatement.getColumnCategories()[i] == TsTableColumnCategory.ATTRIBUTE) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java index 3d294e0c1b6..af95bc4edb9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertBaseStatement.java @@ -310,8 +310,6 @@ public abstract class InsertBaseStatement extends Statement { idColumnIndices.add(i); } } - } else if (columnCategories == null) { - return Collections.emptyList(); } return idColumnIndices; } @@ -544,18 +542,7 @@ public abstract class InsertBaseStatement extends Statement { throw new ArrayIndexOutOfBoundsException(pos); } - String[] tmpMeasurements = new String[measurements.length + 1]; - System.arraycopy(measurements, 0, tmpMeasurements, 0, pos); - tmpMeasurements[pos] = columnSchema.getName(); - System.arraycopy(measurements, pos, tmpMeasurements, pos + 1, measurements.length - pos); - measurements = tmpMeasurements; - - if (measurementSchemas == null) { - measurementSchemas = new MeasurementSchema[measurements.length]; - measurementSchemas[pos] = - new MeasurementSchema( - columnSchema.getName(), InternalTypeManager.getTSDataType(columnSchema.getType())); - } else { + if (measurementSchemas != null) { final MeasurementSchema[] tmp = new MeasurementSchema[measurementSchemas.length + 1]; System.arraycopy(measurementSchemas, 0, tmp, 0, pos); tmp[pos] = @@ -565,9 +552,15 @@ public abstract class InsertBaseStatement extends Statement { measurementSchemas = tmp; } + String[] tmpMeasurements = new String[measurements.length + 1]; + System.arraycopy(measurements, 0, tmpMeasurements, 0, pos); + tmpMeasurements[pos] = columnSchema.getName(); + System.arraycopy(measurements, pos, tmpMeasurements, pos + 1, measurements.length - pos); + measurements = tmpMeasurements; + if (dataTypes == null) { // sql insertion - dataTypes = new TSDataType[measurements.length]; + dataTypes = new TSDataType[measurements.length + 1]; dataTypes[pos] = InternalTypeManager.getTSDataType(columnSchema.getType()); } else { final TSDataType[] tmpTypes = new TSDataType[dataTypes.length + 1]; @@ -578,7 +571,7 @@ public abstract class InsertBaseStatement extends Statement { } if (columnCategories == null) { - columnCategories = new TsTableColumnCategory[measurements.length]; + columnCategories = new TsTableColumnCategory[measurements.length + 1]; columnCategories[pos] = columnSchema.getColumnCategory(); } else { final TsTableColumnCategory[] tmpCategories = @@ -656,9 +649,6 @@ public abstract class InsertBaseStatement extends Statement { @TableModel public List<String> getAttributeColumnNameList() { - if (getColumnCategories() == null) { - return Collections.emptyList(); - } final List<String> attributeColumnNameList = new ArrayList<>(); for (int i = 0; i < getColumnCategories().length; i++) { if (getColumnCategories()[i] == TsTableColumnCategory.ATTRIBUTE) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowStatement.java index 699e71ad831..cdf37fd2e1f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowStatement.java @@ -206,9 +206,6 @@ public class InsertRowStatement extends InsertBaseStatement implements ISchemaVa */ @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning public void transferType(ZoneId zoneId) throws QueryProcessException { - if (measurementSchemas == null) { - return; - } for (int i = 0; i < measurementSchemas.length; i++) { // null when time series doesn't exist diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java index ffb7d22acf6..db6fdb3d8ea 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java @@ -240,7 +240,9 @@ public abstract class AbstractMemTable implements IMemTable { schemaList.add(schema); dataTypes.add(schema.getType()); } - + if (schemaList.isEmpty()) { + return 0; + } memSize += MemUtils.getAlignedRowRecordSize(dataTypes, values, insertRowNode.getColumnCategories()); writeAlignedRow(insertRowNode.getDeviceID(), schemaList, insertRowNode.getTime(), values); @@ -332,18 +334,18 @@ public abstract class AbstractMemTable implements IMemTable { InsertTabletNode insertTabletNode, int start, int end, TSStatus[] results) { List<IMeasurementSchema> schemaList = new ArrayList<>(); - if (insertTabletNode.getMeasurementSchemas() != null) { - for (int i = 0; i < insertTabletNode.getMeasurementSchemas().length; i++) { - if (insertTabletNode.getColumns()[i] == null - || (insertTabletNode.getColumnCategories() != null - && insertTabletNode.getColumnCategories()[i] != TsTableColumnCategory.FIELD)) { - schemaList.add(null); - } else { - schemaList.add(insertTabletNode.getMeasurementSchemas()[i]); - } + for (int i = 0; i < insertTabletNode.getMeasurementSchemas().length; i++) { + if (insertTabletNode.getColumns()[i] == null + || (insertTabletNode.getColumnCategories() != null + && insertTabletNode.getColumnCategories()[i] != TsTableColumnCategory.FIELD)) { + schemaList.add(null); + } else { + schemaList.add(insertTabletNode.getMeasurementSchemas()[i]); } } - + if (schemaList.isEmpty()) { + return; + } final List<Pair<IDeviceID, Integer>> deviceEndOffsetPair = insertTabletNode.splitByDevice(start, end); int splitStart = start;
