This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch fix_insert_case_sensitivity
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit fac246fe4fa75e581a9ce8d3d823a6445fdef481
Author: Tian Jiang <[email protected]>
AuthorDate: Thu Aug 15 10:16:49 2024 +0800

    Fix insertion case sensitivity of table model
---
 .../relational/it/db/it/IoTDBInsertTableIT.java    | 35 ++++++++++++++++++++++
 .../plan/analyze/schema/SchemaValidator.java       |  1 +
 .../relational/sql/ast/WrappedInsertStatement.java |  4 +++
 .../plan/relational/sql/parser/AstBuilder.java     |  3 --
 .../plan/statement/crud/InsertBaseStatement.java   | 13 ++++++++
 .../crud/InsertMultiTabletsStatement.java          |  7 +++++
 .../crud/InsertRowsOfOneDeviceStatement.java       |  7 +++++
 .../plan/statement/crud/InsertRowsStatement.java   |  7 +++++
 8 files changed, 74 insertions(+), 3 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 76be6647d4c..733dbfa4d53 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
@@ -557,6 +557,7 @@ public class IoTDBInsertTableIT {
       st1.execute("flush");
       st1.execute("insert into sg17(id1, time, s1) values('d1', 604799990,1), 
('d1', 604800001,1)");
       st1.execute("flush");
+
       ResultSet rs1 = st1.executeQuery("select time, s1 from sg17");
       assertTrue(rs1.next());
       assertEquals(604799990, rs1.getLong("time"));
@@ -577,6 +578,40 @@ public class IoTDBInsertTableIT {
           "create table if not exists sg18 (id1 string id, s1 string 
attribute, s2 int32 measurement)");
       st1.execute("insert into sg18(id1, s1, s2) values('d1','1', 1)");
       st1.execute("insert into sg18(id1, s1, s2) values('d2', 2, 2)");
+
+      ResultSet rs1 = st1.executeQuery("select time, s1, s2 from sg18");
+      assertTrue(rs1.next());
+      assertEquals("1", rs1.getString("s1"));
+      assertTrue(rs1.next());
+      assertEquals("2", rs1.getString("s1"));
+      assertFalse(rs1.next());
+    }
+  }
+
+  @Test
+  public void testInsertCaseSensitivity() throws SQLException {
+    try (Connection connection = 
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        Statement st1 = connection.createStatement()) {
+      st1.execute("use \"test\"");
+      st1.execute(
+          "create table if not exists sg19 (id1 string id, ss1 string 
attribute, ss2 int32 measurement)");
+      // lower case
+      st1.execute("insert into sg19(time, id1, ss1, ss2) values(1, 'd1','1', 
1)");
+      st1.execute("insert into sg19(time, id1, ss1, ss2) values(2, 'd2', 2, 
2)");
+      // upper case
+      st1.execute("insert into sg19(TIME, ID1, SS1, SS2) values(3, 'd3','3', 
3)");
+      st1.execute("insert into sg19(TIME, ID1, SS1, SS2) values(4, 'd4', 4, 
4)");
+      // mixed
+      st1.execute("insert into sg19(TIme, Id1, Ss1, Ss2) values(5, 'd5','5', 
5)");
+      st1.execute("insert into sg19(TIme, Id1, sS1, sS2) values(6, 'd6', 6, 
6)");
+
+      ResultSet rs1 = st1.executeQuery("select time, ss1, ss2 from sg19");
+      for (int i = 0; i < 6; i++) {
+        assertTrue(rs1.next());
+        assertEquals(i, rs1.getLong("time"));
+        assertEquals(String.valueOf(i), rs1.getString("ss1"));
+        assertEquals(i, rs1.getInt("ss2"));
+      }
     }
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/SchemaValidator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/SchemaValidator.java
index bc4d275c285..2458ff36338 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/SchemaValidator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/SchemaValidator.java
@@ -64,6 +64,7 @@ public class SchemaValidator {
   public static void validate(
       Metadata metadata, WrappedInsertStatement insertStatement, 
MPPQueryContext context) {
     try {
+      insertStatement.columnsToLowerCase();
       insertStatement.validateTableSchema(metadata, context);
       insertStatement.updateAfterSchemaValidation(context);
       insertStatement.validateDeviceSchema(metadata, context);
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 e8481557784..f86ed3ab9f8 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
@@ -218,4 +218,8 @@ public abstract class WrappedInsertStatement extends 
WrappedStatement
     }
     return databaseName;
   }
+
+  public void columnsToLowerCase() {
+    getInnerTreeStatement().measurementsToLowerCase();
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index b2e98656fa1..3160c2c43f1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -417,9 +417,6 @@ public class AstBuilder extends 
RelationalSqlBaseVisitor<Node> {
     InsertRowsStatement insertRowsStatement = new InsertRowsStatement();
     insertRowsStatement.setInsertRowStatementList(rowStatements);
     insertRowsStatement.setWriteToTable(true);
-    insertRowsStatement.setDevicePath(new PartialPath(new String[] 
{tableName}));
-    databaseName.ifPresent(insertRowsStatement::setDatabaseName);
-    insertRowsStatement.setMeasurements(columnNameArray);
     return new InsertRows(insertRowsStatement, null);
   }
 
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 8bccc30f493..5dd11f2c967 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
@@ -551,5 +551,18 @@ public abstract class InsertBaseStatement extends 
Statement {
   public Optional<String> getDatabaseName() {
     return Optional.ofNullable(databaseName);
   }
+
   // endregion
+
+  @TableModel
+  public void measurementsToLowerCase() {
+    if (measurements == null) {
+      return;
+    }
+    for (int i = 0; i < measurements.length; i++) {
+      if (measurements[i] != null) {
+        measurements[i] = measurements[i].toLowerCase();
+      }
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertMultiTabletsStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertMultiTabletsStatement.java
index bfc4e6406c6..01b76524f1c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertMultiTabletsStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertMultiTabletsStatement.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaValidation;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.utils.annotations.TableModel;
 
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.NotImplementedException;
@@ -144,4 +145,10 @@ public class InsertMultiTabletsStatement extends 
InsertBaseStatement {
     splitResult.setInsertTabletStatementList(mergedList);
     return splitResult;
   }
+
+  @TableModel
+  @Override
+  public void measurementsToLowerCase() {
+    
insertTabletStatementList.forEach(InsertTabletStatement::measurementsToLowerCase);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
index 66bdcd35feb..6097a4118f3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsOfOneDeviceStatement.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaValidation;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.utils.annotations.TableModel;
 
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.NotImplementedException;
@@ -167,4 +168,10 @@ public class InsertRowsOfOneDeviceStatement extends 
InsertBaseStatement {
     }
     return this;
   }
+
+  @TableModel
+  @Override
+  public void measurementsToLowerCase() {
+    
insertRowStatementList.forEach(InsertRowStatement::measurementsToLowerCase);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsStatement.java
index 68a0264a508..175031f9196 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/crud/InsertRowsStatement.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.queryengine.common.MPPQueryContext;
 import org.apache.iotdb.db.queryengine.plan.analyze.schema.ISchemaValidation;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
 import org.apache.iotdb.db.queryengine.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.utils.annotations.TableModel;
 
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.NotImplementedException;
@@ -173,4 +174,10 @@ public class InsertRowsStatement extends 
InsertBaseStatement {
             })
         .collect(Collectors.toList());
   }
+
+  @TableModel
+  @Override
+  public void measurementsToLowerCase() {
+    
insertRowStatementList.forEach(InsertRowStatement::measurementsToLowerCase);
+  }
 }

Reply via email to