This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch ty/TableIT in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 88d1a8480047f7368ce25af2de618aec95c6dfa1 Author: JackieTien97 <[email protected]> AuthorDate: Wed Jul 24 15:10:56 2024 +0800 partial --- .../it/query/old/IoTDBNestedQueryIT.java | 68 ++++++++++++++-------- .../relational/analyzer/ExpressionAnalyzer.java | 3 +- .../relational/metadata/TableMetadataImpl.java | 6 +- .../dag/column/unary/InColumnTransformer.java | 8 ++- 4 files changed, 59 insertions(+), 26 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java index 629579747f0..b64c0f51436 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/IoTDBNestedQueryIT.java @@ -77,10 +77,10 @@ public class IoTDBNestedQueryIT { statement.execute("CREATE DATABASE " + DATABASE_NAME); statement.execute("USE " + DATABASE_NAME); statement.execute( - "create table vehicle1(device_id STRING ID, s1 INT32 MEASUREMENT, s2 INT32 MEASUREMENT, s3 TEXT MEASUREMENT, s4 STRING MEASUREMENT, s5 DATE MEASUREMENT, s6 TIMESTAMP MEASUREMENT);"); + "create table vehicle1(device_id STRING ID, s1 INT32 MEASUREMENT, s2 INT32 MEASUREMENT, s3 TEXT MEASUREMENT, s4 STRING MEASUREMENT, s5 DATE MEASUREMENT, s6 TIMESTAMP MEASUREMENT)"); statement.execute( - "create table vehicle2(device_id STRING ID, s1 FLOAT MEASUREMENT, s2 DOUBLE MEASUREMENT, empty DOUBLE MEASUREMENT"); + "create table vehicle2(device_id STRING ID, s1 FLOAT MEASUREMENT, s2 DOUBLE MEASUREMENT, empty DOUBLE MEASUREMENT)"); } catch (SQLException throwable) { fail(throwable.getMessage()); } @@ -93,15 +93,16 @@ public class IoTDBNestedQueryIT { for (int i = 1; i <= ITERATION_TIMES; ++i) { statement.execute( String.format( - "insert into vehicle1(time,device_id,s1,s2,s3,s4,s6) values(%d,%s%d,%d,%s,%s,%d)", - i, "d1", i, i, i, i, i)); + "insert into vehicle1(time,device_id,s1,s2,s3,s4,s6) values(%d,%s,%d,%d,%s,%s,%d)", + i, "'d1'", i, i, i, i, i)); statement.execute( (String.format( - "insert into vehicle2(time,device_id,s1,s2) values(%d,%s,%d,%d)", i, "d2", i, i))); + "insert into vehicle2(time,device_id,s1,s2) values(%d,%s,%d,%d)", + i, "'d2'", i, i))); } - statement.execute("insert into vehicle1(timestamp,s5) values(1, 'd1', '2024-01-01')"); - statement.execute("insert into vehicle1(timestamp,s5) values(2, 'd1','2024-01-02')"); - statement.execute("insert into vehicle1(timestamp,s5) values(3, 'd1','2024-01-03')"); + statement.execute("insert into vehicle1(time,device_id,s5) values(1, 'd1', '2024-01-01')"); + statement.execute("insert into vehicle1(time,device_id,s5) values(2, 'd1','2024-01-02')"); + statement.execute("insert into vehicle1(time,device_id,s5) values(3, 'd1','2024-01-03')"); } catch (SQLException throwable) { fail(throwable.getMessage()); } @@ -113,8 +114,10 @@ public class IoTDBNestedQueryIT { String sqlStr = "select time, s1, s2, sin(sin(s1) * sin(s2) + cos(s1) * cos(s1)) + sin(sin(s1 - s1 + s2) * sin(s2) + cos(s1) * cos(s1)), asin(sin(asin(sin(s1 - s2 / (-s1))))) from vehicle2"; - try (Connection connection = EnvFactory.getEnv().getConnection(); + try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); + ResultSet resultSet = statement.executeQuery(sqlStr); assertEquals(1 + 4, resultSet.getMetaData().getColumnCount()); @@ -143,6 +146,7 @@ public class IoTDBNestedQueryIT { public void testRawDataQueryWithConstants() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT time, 1 + s1 FROM vehicle1 where device_id='d1'"; try (ResultSet rs = statement.executeQuery(query)) { @@ -173,6 +177,7 @@ public class IoTDBNestedQueryIT { public void testDuplicatedRawDataQueryWithConstants() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT time, 1 + s1, 1 + s1 FROM vehicle1 where device_id='d1'"; try (ResultSet rs = statement.executeQuery(query)) { @@ -194,6 +199,7 @@ public class IoTDBNestedQueryIT { public void testCommutativeLaws() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT time, s1, s1 + 1, 1 + s1, s1 * 2, 2 * s1 FROM vehicle1 where device_id='d1'"; @@ -219,6 +225,7 @@ public class IoTDBNestedQueryIT { public void testAssociativeLaws() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT time, s1, s1 + 1 + 2, (s1 + 1) + 2, s1 + (1 + 2), s1 * 2 * 3, s1 * (2 * 3), (s1 * 2) * 3 FROM vehicle1 where device_id='d1'"; @@ -246,6 +253,7 @@ public class IoTDBNestedQueryIT { public void testDistributiveLaw() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT time, s1, (s1 + 1) * 2, s1 * 2 + 1 * 2, (s1 + 1) / 2, s1 / 2 + 1 / 2 FROM vehicle1 where device_id='d1'"; @@ -275,6 +283,7 @@ public class IoTDBNestedQueryIT { // 3. addition and subtraction try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT time, 1 + s1 * 2 + 1, (1 + s1) * 2 + 1, (1 + s1) * (2 + 1) FROM vehicle1 where device_id='d1'"; @@ -312,12 +321,17 @@ public class IoTDBNestedQueryIT { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { int start = 2, end = 8; + statement.execute("USE " + DATABASE_NAME); String query = - "SELECT * FROM vehicle1 where device_id='d1' WHERE s1 BETWEEN " + start + " AND " + end; + "SELECT * FROM vehicle1 where device_id='d1' and (s1 BETWEEN " + + start + + " AND " + + end + + ")"; try (ResultSet rs = statement.executeQuery(query)) { for (int i = start; i <= end; i++) { Assert.assertTrue(rs.next()); - Assert.assertEquals(String.valueOf(i), rs.getString("time")); + Assert.assertEquals(i, rs.getLong("time")); Assert.assertEquals(String.valueOf(i), rs.getString("s1")); Assert.assertEquals(String.valueOf(i), rs.getString("s2")); Assert.assertEquals(String.valueOf(i), rs.getString("s3")); @@ -325,19 +339,20 @@ public class IoTDBNestedQueryIT { } query = - "SELECT * FROM vehicle1 where device_id='d1' WHERE s1 NOT BETWEEN " // test not between + "SELECT * FROM vehicle1 where device_id='d1' and (s1 NOT BETWEEN " // test not between + (end + 1) + " AND " - + ITERATION_TIMES; + + ITERATION_TIMES + + ")"; try (ResultSet rs = statement.executeQuery(query)) { Assert.assertTrue(rs.next()); - Assert.assertEquals("1", rs.getString("time")); + Assert.assertEquals(1, rs.getLong("time")); Assert.assertEquals("1", rs.getString("s1")); Assert.assertEquals("1", rs.getString("s2")); Assert.assertEquals("1", rs.getString("s3")); for (int i = start; i <= end; i++) { Assert.assertTrue(rs.next()); - Assert.assertEquals(String.valueOf(i), rs.getString("time")); + Assert.assertEquals(i, rs.getLong("time")); Assert.assertEquals(String.valueOf(i), rs.getString("s1")); Assert.assertEquals(String.valueOf(i), rs.getString("s2")); Assert.assertEquals(String.valueOf(i), rs.getString("s3")); @@ -345,11 +360,15 @@ public class IoTDBNestedQueryIT { } query = - "SELECT * FROM vehicle1 where device_id='d1' WHERE time BETWEEN " + start + " AND " + end; + "SELECT * FROM vehicle1 where device_id='d1' and (time BETWEEN " + + start + + " AND " + + end + + ")"; try (ResultSet rs = statement.executeQuery(query)) { for (int i = start; i <= end; i++) { Assert.assertTrue(rs.next()); - Assert.assertEquals(String.valueOf(i), rs.getString("time")); + Assert.assertEquals(i, rs.getLong("time")); Assert.assertEquals(String.valueOf(i), rs.getString("s1")); Assert.assertEquals(String.valueOf(i), rs.getString("s2")); Assert.assertEquals(String.valueOf(i), rs.getString("s3")); @@ -357,19 +376,20 @@ public class IoTDBNestedQueryIT { } query = - "SELECT * FROM vehicle1 where device_id='d1' WHERE time NOT BETWEEN " // test not between + "SELECT * FROM vehicle1 where device_id='d1' and (time NOT BETWEEN " // test not between + (end + 1) + " AND " - + ITERATION_TIMES; + + ITERATION_TIMES + + ")"; try (ResultSet rs = statement.executeQuery(query)) { Assert.assertTrue(rs.next()); - Assert.assertEquals("1", rs.getString("time")); + Assert.assertEquals(1, rs.getLong("time")); Assert.assertEquals("1", rs.getString("s1")); Assert.assertEquals("1", rs.getString("s2")); Assert.assertEquals("1", rs.getString("s3")); for (int i = start; i <= end; i++) { Assert.assertTrue(rs.next()); - Assert.assertEquals(String.valueOf(i), rs.getString("time")); + Assert.assertEquals(i, rs.getLong("time")); Assert.assertEquals(String.valueOf(i), rs.getString("s1")); Assert.assertEquals(String.valueOf(i), rs.getString("s2")); Assert.assertEquals(String.valueOf(i), rs.getString("s3")); @@ -406,9 +426,10 @@ public class IoTDBNestedQueryIT { // } // Assert.assertFalse(rs.next()); // } + statement.execute("USE " + DATABASE_NAME); String query3 = - "SELECT time,s1 FROM vehicle1 where device_id='d1' WHERE s5 IN ('2024-01-01', '2024-01-02', '2024-01-03')"; + "SELECT time,s1 FROM vehicle1 where device_id='d1' and s5 IN ('2024-01-01', '2024-01-02', '2024-01-03')"; try (ResultSet rs = statement.executeQuery(query3)) { for (int i = 1; i <= 3; i++) { Assert.assertTrue(rs.next()); @@ -417,7 +438,7 @@ public class IoTDBNestedQueryIT { Assert.assertFalse(rs.next()); } - String query4 = "SELECT time,s1 FROM vehicle1 where device_id='d1' WHERE s6 IN (1, 2, 3)"; + String query4 = "SELECT time,s1 FROM vehicle1 where device_id='d1' and s6 IN (1, 2, 3)"; try (ResultSet rs = statement.executeQuery(query4)) { for (int i = 1; i <= 3; i++) { Assert.assertTrue(rs.next()); @@ -436,6 +457,7 @@ public class IoTDBNestedQueryIT { public void testTimeExpressions() { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); Statement statement = connection.createStatement()) { + statement.execute("USE " + DATABASE_NAME); String query = "SELECT s1, time, time, -(-time), time + 1 - 1, time + s1 - s1, time + 1 - 1 FROM vehicle1 where device_id='d1'"; try (ResultSet rs = statement.executeQuery(query)) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java index cf1350f51a5..abd20c49c4a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java @@ -853,7 +853,8 @@ public class ExpressionAnalyzer { Type minType = process(node.getMin(), context); Type maxType = process(node.getMax(), context); - if (valueType.equals(minType) || valueType.equals(maxType)) { + if (!isTwoTypeComparable(Arrays.asList(valueType, minType)) + || !isTwoTypeComparable(Arrays.asList(valueType, maxType))) { throw new SemanticException( String.format("Cannot check if %s is BETWEEN %s and %s", valueType, minType, maxType)); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java index aa18bf262fa..e9296198fbf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java @@ -44,6 +44,7 @@ import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache; import org.apache.iotdb.db.utils.constant.SqlConstant; import org.apache.tsfile.file.metadata.IDeviceID; +import org.apache.tsfile.read.common.type.DateType; import org.apache.tsfile.read.common.type.StringType; import org.apache.tsfile.read.common.type.TimestampType; import org.apache.tsfile.read.common.type.Type; @@ -422,6 +423,9 @@ public class TableMetadataImpl implements Metadata { } // Boolean type and Binary Type can not be compared with other types - return (isNumericType(left) && isNumericType(right)) || (isCharType(left) && isCharType(right)); + return (isNumericType(left) && isNumericType(right)) + || (isCharType(left) && isCharType(right)) + || (isCharType(left) && DateType.DATE.equals(right)) + || (DateType.DATE.equals(left) && isCharType(right)); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java index d7e32db83e4..884b5006f2b 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java @@ -32,6 +32,7 @@ import org.apache.tsfile.block.column.ColumnBuilder; import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.read.common.type.Type; import org.apache.tsfile.read.common.type.TypeEnum; +import org.apache.tsfile.utils.DateUtils; import java.util.HashSet; import java.util.List; @@ -180,7 +181,6 @@ public class InColumnTransformer extends UnaryColumnTransformer { String errorMsg = "\"%s\" cannot be cast to [%s]"; switch (childType) { case INT32: - case DATE: intSet = new HashSet<>(); for (Literal value : values) { try { @@ -190,6 +190,12 @@ public class InColumnTransformer extends UnaryColumnTransformer { } } break; + case DATE: + intSet = new HashSet<>(); + for (Literal value : values) { + intSet.add(DateUtils.parseDateExpressionToInt(((StringLiteral) value).getValue())); + } + break; case INT64: case TIMESTAMP: longSet = new HashSet<>();
