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