This is an automated email from the ASF dual-hosted git repository. jiangtian pushed a commit to branch fix_status_code_of_type_column_mismatch in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit cef3b45284cb0ac875c970a5dd4eeac2945829ad Author: Tian Jiang <[email protected]> AuthorDate: Thu Aug 22 12:05:24 2024 +0800 Update status code when data type or column category mismatches in insertion. --- .../iotdb/session/it/IoTDBSessionRelationalIT.java | 31 ++++++++++++++++++++++ .../java/org/apache/iotdb/rpc/TSStatusCode.java | 2 +- .../iotdb/db/exception/sql/SemanticException.java | 8 ++++++ .../db/queryengine/plan/analyze/AnalyzeUtils.java | 2 +- .../fetcher/TableHeaderSchemaValidator.java | 9 ++++--- .../relational/sql/ast/WrappedInsertStatement.java | 5 +++- .../plan/statement/crud/InsertRowStatement.java | 4 ++- .../schema/table/column/TsTableColumnSchema.java | 4 +++ 8 files changed, 58 insertions(+), 7 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionRelationalIT.java b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionRelationalIT.java index 8d01cdb15ab..5bcf9e79e2b 100644 --- a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionRelationalIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionRelationalIT.java @@ -344,6 +344,37 @@ public class IoTDBSessionRelationalIT { } } + @Test + @Category({LocalStandaloneIT.class, ClusterIT.class}) + public void partialInsertSQLTest() throws IoTDBConnectionException, StatementExecutionException { + try (ISession session = EnvFactory.getEnv().getSessionConnection(TREE_SQL_DIALECT)) { + // disable auto-creation only for this test + session.executeNonQueryStatement("SET CONFIGURATION \"enable_auto_create_schema\"=\"false\""); + } + try (ISession session = EnvFactory.getEnv().getSessionConnection(TABLE_SQL_DIALECT)) { + session.executeNonQueryStatement("USE \"db1\""); + // the table is missing column "m2" + session.executeNonQueryStatement( + "CREATE TABLE table2_2 (id1 string id, attr1 string attribute, " + + "m1 double " + + "measurement)"); + try { + session.executeNonQueryStatement( + "INSERT INTO table2_2 (time, id1, attr1, m1, m2) values (1, '1', '1', 1.0, 2.0)"); + fail("Exception expected"); + } catch (StatementExecutionException e) { + assertEquals( + "615: Unknown column category for m2. Cannot auto create column.", e.getMessage()); + } + + } finally { + try (ISession session = EnvFactory.getEnv().getSessionConnection(TREE_SQL_DIALECT)) { + session.executeNonQueryStatement( + "SET CONFIGURATION \"enable_auto_create_schema\"=\"true\""); + } + } + } + @Test @Category({LocalStandaloneIT.class, ClusterIT.class}) public void insertRelationalRowTest() diff --git a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java index cb2e8220e90..3ce87362ee3 100644 --- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java +++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java @@ -107,7 +107,7 @@ public enum TSStatusCode { DISK_SPACE_INSUFFICIENT(611), OVERSIZE_TTL(612), TTL_CONFIG_ERROR(613), - COLUMN_TYPE_MISMATCH(614), + DATA_TYPE_MISMATCH(614), COLUMN_CATEGORY_MISMATCH(615), // Query Engine diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/SemanticException.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/SemanticException.java index 66f3af08e91..630929318c2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/SemanticException.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/sql/SemanticException.java @@ -24,6 +24,14 @@ import org.apache.iotdb.rpc.TSStatusCode; public class SemanticException extends IoTDBRuntimeException { + public SemanticException(String message, int statusCode) { + super(message, statusCode); + } + + public SemanticException(Throwable cause, int statusCode) { + super(cause, statusCode); + } + public SemanticException(String message) { super(message, TSStatusCode.SEMANTIC_ERROR.getStatusCode()); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java index 8c7d245f113..3745ab09054 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java @@ -210,7 +210,7 @@ public class AnalyzeUtils { analysis.setFailStatus( RpcUtils.getStatus(exception.getErrorCode(), exception.getMessage())); } else { - analysis.setFailStatus(RpcUtils.getStatus(TSStatusCode.METADATA_ERROR, e.getMessage())); + analysis.setFailStatus(RpcUtils.getStatus(e.getErrorCode(), e.getMessage())); } } finally { PERFORMANCE_OVERVIEW_METRICS.recordScheduleSchemaValidateCost(System.nanoTime() - startTime); 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 3bd069e2a0a..70c23116314 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 @@ -119,13 +119,15 @@ public class TableHeaderSchemaValidator { throw new SemanticException( String.format( "Unknown column category for %s. Cannot auto create column.", - columnSchema.getName())); + columnSchema.getName()), + TSStatusCode.COLUMN_CATEGORY_MISMATCH.getStatusCode()); } if (columnSchema.getType() == null) { throw new SemanticException( String.format( "Unknown column data type for %s. Cannot auto create column.", - columnSchema.getName())); + columnSchema.getName()), + TSStatusCode.DATA_TYPE_MISMATCH.getStatusCode()); } missingColumnList.add(columnSchema); } else { @@ -136,7 +138,8 @@ public class TableHeaderSchemaValidator { if (columnSchema.getColumnCategory() != null && !existingColumn.getColumnCategory().equals(columnSchema.getColumnCategory())) { throw new SemanticException( - String.format("Wrong category at column %s.", columnSchema.getName())); + String.format("Wrong category at column %s.", columnSchema.getName()), + TSStatusCode.COLUMN_CATEGORY_MISMATCH.getStatusCode()); } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java index 801ec407b90..40efbcc669c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/WrappedInsertStatement.java @@ -30,6 +30,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableSchema; import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertBaseStatement; +import org.apache.iotdb.db.utils.TypeInferenceUtils; import org.apache.tsfile.common.conf.TSFileDescriptor; import org.apache.tsfile.enums.TSDataType; @@ -82,7 +83,9 @@ public abstract class WrappedInsertStatement extends WrappedStatement insertBaseStatement.getMeasurements()[i], insertBaseStatement.getDataType(i) != null ? TypeFactory.getType(insertBaseStatement.getDataType(i)) - : null, + : TypeFactory.getType( + TypeInferenceUtils.getPredictedDataType( + insertBaseStatement.getFirstValueOfIndex(i), true)), false, insertBaseStatement.getColumnCategory(i))); } else { 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 f2fa614fc58..a0b67ba997d 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 @@ -40,6 +40,7 @@ import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor; import org.apache.iotdb.db.utils.CommonUtils; import org.apache.iotdb.db.utils.TypeInferenceUtils; import org.apache.iotdb.db.utils.annotations.TableModel; +import org.apache.iotdb.rpc.TSStatusCode; import org.apache.tsfile.enums.TSDataType; import org.apache.tsfile.file.metadata.IDeviceID; @@ -247,7 +248,8 @@ public class InsertRowStatement extends InsertBaseStatement implements ISchemaVa if (!IoTDBDescriptor.getInstance().getConfig().isEnablePartialInsert()) { throw e; } else { - markFailedMeasurement(i, e); + markFailedMeasurement( + i, new SemanticException(e, TSStatusCode.DATA_TYPE_MISMATCH.getStatusCode())); } } } diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/column/TsTableColumnSchema.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/column/TsTableColumnSchema.java index f1bf80b5a52..af6baf7c043 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/column/TsTableColumnSchema.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/column/TsTableColumnSchema.java @@ -71,4 +71,8 @@ public abstract class TsTableColumnSchema { public int hashCode() { return Objects.hash(columnName); } + + public void setDataType(TSDataType dataType) { + this.dataType = dataType; + } }
