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;
+  }
 }

Reply via email to