This is an automated email from the ASF dual-hosted git repository. justinchen pushed a commit to branch tree-fix-207 in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 8bf15522a66c43e5daba36ccb70fa2b2e6bd85a2 Author: Caideyipi <[email protected]> AuthorDate: Wed Mar 4 12:56:16 2026 +0800 Fixed the quote problem in "as" clause in view && Fixed the bug that the device may not be able to be queried from cache (#17241) --- .../view/recent/IoTDBComplexQueryTableViewIT.java | 18 ++++---- .../iotdb/relational/it/schema/IoTDBTableIT.java | 54 ++++++++++++---------- .../common/header/DatasetHeaderFactory.java | 2 +- .../operator/schema/source/DeviceSchemaSource.java | 2 +- .../metadata/relational/ShowCreateViewTask.java | 2 +- .../plan/planner/OperatorTreeGenerator.java | 2 +- .../node/metadata/read/DevicesSchemaScanNode.java | 24 +++++----- .../metadata/fetcher/TableDeviceSchemaFetcher.java | 12 ++--- .../sql/ast/AbstractQueryDeviceWithCache.java | 14 ++++-- .../plan/relational/sql/parser/AstBuilder.java | 30 ++++++++---- .../read/resp/info/impl/ShowDevicesResult.java | 5 +- .../logical/SchemaQueryLogicalPlannerTest.java | 6 +-- .../schema/column/ColumnHeaderConstant.java | 2 +- 13 files changed, 96 insertions(+), 77 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/recent/IoTDBComplexQueryTableViewIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/recent/IoTDBComplexQueryTableViewIT.java index 96f0a9de596..b6617ec50dd 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/recent/IoTDBComplexQueryTableViewIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/recent/IoTDBComplexQueryTableViewIT.java @@ -48,10 +48,10 @@ public class IoTDBComplexQueryTableViewIT { "create aligned timeseries root.test.employees.D002(name TEXT,Gender TEXT,Status BOOLEAN,employee_id INT32,salary DOUBLE,date_of_birth DATE,Contac_info string)", "create aligned timeseries root.test.employees.D002(name TEXT,Gender TEXT,Status BOOLEAN,employee_id INT32,salary DOUBLE,date_of_birth DATE,Contac_info string)", "create aligned timeseries root.test.employees.D003(name TEXT,Gender TEXT,Status BOOLEAN,employee_id INT32,salary DOUBLE,date_of_birth DATE,Contac_info string)", - "create aligned timeseries root.test.departments.D001(department_id STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", - "create aligned timeseries root.test.departments.D002(department_id STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", - "create aligned timeseries root.test.departments.D003(department_id STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", - "create aligned timeseries root.test.departments.D004(department_id STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", + "create aligned timeseries root.test.departments.D001(`1department_id` STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", + "create aligned timeseries root.test.departments.D002(`1department_id` STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", + "create aligned timeseries root.test.departments.D003(`1department_id` STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", + "create aligned timeseries root.test.departments.D004(`1department_id` STRING,dep_name TEXT,dep_phone TEXT,dep_status BOOLEAN,dep_member INT32,employee_id INT32)", "insert into root.test.employees.D001(time, name, gender, status, employee_id, salary, date_of_birth, contac_info) aligned values(1, 'Mary','Female', false, 1223, 5500.22, '1988-10-12', '133-1212-1234')", "insert into root.test.employees.D001(time, name, gender, status, employee_id, salary, date_of_birth, contac_info) aligned values(2, 'John', 'Male', true, 40012, 8822, '1985-06-15', '130-1002-1334')", "insert into root.test.employees.D002(time, name, gender, status, employee_id, salary, date_of_birth, contac_info) aligned values(3, 'Nancy', 'Female', true, 30112, 10002, '1983-08-15', '135-1302-1354')", @@ -69,8 +69,8 @@ public class IoTDBComplexQueryTableViewIT { new String[] { "CREATE DATABASE " + DATABASE_NAME, "USE " + DATABASE_NAME, - "create view employees(department_id STRING TAG,name TEXT FIELD,Gender TEXT FIELD,Status BOOLEAN FIELD,employee_id INT32 FIELD,salary DOUBLE FIELD,date_of_birth DATE FIELD,Contac_info string FIELD) as root.test.employees.**", - "create view departments(department_id STRING TAG,dep_name TEXT FIELD,dep_phone TEXT FIELD,dep_status BOOLEAN FIELD,dep_member INT32 FIELD,employee_id INT32 FIELD) as root.test.departments.**", + "create view employees(\"`1department_id`\" STRING TAG,name TEXT FIELD,Gender TEXT FIELD,Status BOOLEAN FIELD,employee_id INT32 FIELD,salary DOUBLE FIELD,date_of_birth DATE FIELD,Contac_info string FIELD) as root.test.employees.**", + "create view departments(\"`1department_id`\" STRING TAG,dep_name TEXT FIELD,dep_phone TEXT FIELD,dep_status BOOLEAN FIELD,dep_member INT32 FIELD,employee_id INT32 FIELD) as root.test.departments.**", }; @BeforeClass @@ -88,11 +88,11 @@ public class IoTDBComplexQueryTableViewIT { @Test public void queryTest1() { // Look for the non-intersecting departments in the two tables - String[] expectedHeader = new String[] {"department_id", "dep_name"}; + String[] expectedHeader = new String[] {"`1department_id`", "dep_name"}; String[] retArray = new String[] {"D004,人事部,"}; tableResultSetEqualTest( - "select department_id, dep_name from departments where not exists(" - + "select 1 from employees where employees.department_id = departments.department_id)", + "select \"`1department_id`\", dep_name from departments where not exists(" + + "select 1 from employees where employees.\"`1department_id`\" = departments.\"`1department_id`\")", expectedHeader, retArray, DATABASE_NAME); diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java index 54881fb8293..96fe00d2293 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java @@ -766,10 +766,10 @@ public class IoTDBTableIT { try (final Connection connection = EnvFactory.getEnv().getConnection(); final Statement statement = connection.createStatement()) { statement.execute("create database root.another"); - statement.execute("create database root.`重庆`.b"); - statement.execute("create timeSeries root.`重庆`.b.c.S1 int32"); - statement.execute("create timeSeries root.`重庆`.b.c.s2 string"); - statement.execute("create timeSeries root.`重庆`.b.S1 int32"); + statement.execute("create database root.`重庆`.`1`.b"); + statement.execute("create timeSeries root.`重庆`.`1`.b.`2`.S1 int32"); + statement.execute("create timeSeries root.`重庆`.`1`.b.`2`.s2 string"); + statement.execute("create timeSeries root.`重庆`.`1`.b.S1 int32"); } catch (SQLException e) { fail(e.getMessage()); } @@ -788,13 +788,13 @@ public class IoTDBTableIT { "701: Cannot specify view pattern to match more than one tree database.", e.getMessage()); } - statement.execute("create view tree_table (tag1 tag, tag2 tag) as root.\"重庆\".**"); + statement.execute("create view tree_table (tag1 tag, tag2 tag) as root.\"重庆\".\"1\".**"); statement.execute("drop view tree_table"); } try (final Connection connection = EnvFactory.getEnv().getConnection(); final Statement statement = connection.createStatement()) { - statement.execute("create timeSeries root.`重庆`.b.d.s1 int32"); + statement.execute("create timeSeries root.`重庆`.`1`.b.`1`.s1 int32"); } catch (SQLException e) { fail(e.getMessage()); } @@ -805,7 +805,7 @@ public class IoTDBTableIT { statement.execute("use tree_view_db"); try { - statement.execute("create view tree_table (tag1 tag, tag2 tag) as root.\"重庆\".**"); + statement.execute("create view tree_table (tag1 tag, tag2 tag) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { final Set<String> result = @@ -819,13 +819,13 @@ public class IoTDBTableIT { try (final Connection connection = EnvFactory.getEnv().getConnection(); final Statement statement = connection.createStatement()) { - statement.execute("drop timeSeries root.`重庆`.b.d.s1"); + statement.execute("drop timeSeries root.`重庆`.`1`.b.`1`.s1"); statement.execute("create device template t1 (S1 boolean, s9 int32)"); - statement.execute("set schema template t1 to root.`重庆`.b.d"); - statement.execute("create timeSeries root.`重庆`.b.c.f.g.h.S1 int32"); + statement.execute("set schema template t1 to root.`重庆`.`1`.b.`1`"); + statement.execute("create timeSeries root.`重庆`.`1`.b.`2`.f.g.h.S1 int32"); // Put schema cache - statement.execute("select S1, s2 from root.`重庆`.b.c"); + statement.execute("select S1, s2 from root.`重庆`.`1`.b.`2`"); } catch (SQLException e) { fail(e.getMessage()); } @@ -836,7 +836,7 @@ public class IoTDBTableIT { statement.execute("use tree_view_db"); try { - statement.execute("create view tree_table (tag1 tag, tag2 tag) as root.\"重庆\".**"); + statement.execute("create view tree_table (tag1 tag, tag2 tag) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals( @@ -846,7 +846,7 @@ public class IoTDBTableIT { try { statement.execute( - "create view tree_table (tag1 tag, tag2 tag, S1 field) as root.\"重庆\".**"); + "create view tree_table (tag1 tag, tag2 tag, S1 field) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals( @@ -857,7 +857,7 @@ public class IoTDBTableIT { try (final Connection connection = EnvFactory.getEnv().getConnection(); final Statement statement = connection.createStatement()) { - statement.execute("create timeSeries root.`重庆`.b.e.s1 int32"); + statement.execute("create timeSeries root.`重庆`.`1`.b.e.s1 int32"); } catch (SQLException e) { fail(e.getMessage()); } @@ -878,7 +878,7 @@ public class IoTDBTableIT { // Temporary try { statement.execute( - "create or replace view tree_table (tag1 tag, tag2 tag, S1 int32 field, s3 boolean from S1) as root.\"重庆\".**"); + "create or replace view tree_table (tag1 tag, tag2 tag, S1 int32 field, s3 boolean from S1) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals( @@ -887,14 +887,14 @@ public class IoTDBTableIT { try { statement.execute( - "create or replace view tree_table (tag1 tag, tag2 tag, S1 int32 field, s3 from s2, s8 field) as root.\"重庆\".**"); + "create or replace view tree_table (tag1 tag, tag2 tag, S1 int32 field, s3 from s2, s8 field) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals("528: Measurements not found for s8, cannot auto detect", e.getMessage()); } statement.execute( - "create or replace view tree_table (tag1 tag, tag2 tag, S1 int32 field, s3 from s2) as root.\"重庆\".**"); + "create or replace view tree_table (tag1 tag, tag2 tag, S1 int32 field, s3 from s2) as root.\"重庆\".\"1\".**"); // Cannot be written try { @@ -942,11 +942,15 @@ public class IoTDBTableIT { TestUtils.assertResultSetEqual( statement.executeQuery("show devices from view_table where tag1 = 'b'"), "tag1,tag2,", - new HashSet<>(Arrays.asList("b,c,", "b,null,", "b,e,"))); + new HashSet<>(Arrays.asList("b,`2`,", "b,null,", "b,e,"))); TestUtils.assertResultSetEqual( statement.executeQuery("show devices from view_table where tag1 = 'b' and tag2 is null"), "tag1,tag2,", Collections.singleton("b,null,")); + TestUtils.assertResultSetEqual( + statement.executeQuery("show devices from view_table where tag1 = 'b' and tag2 = '`2`'"), + "tag1,tag2,", + Collections.singleton("b,`2`,")); TestUtils.assertResultSetEqual( statement.executeQuery("count devices from view_table"), "count(devices),", @@ -958,7 +962,7 @@ public class IoTDBTableIT { final Statement statement = connection.createStatement()) { // Test create & replace + restrict statement.execute( - "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.`重庆`.**"); + "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.`重庆`.`1`.**"); fail(); } catch (final SQLException e) { assertTrue( @@ -979,7 +983,7 @@ public class IoTDBTableIT { .getConnection("testUser", "testUser123456", BaseEnv.TABLE_SQL_DIALECT); final Statement statement = connection.createStatement()) { statement.execute( - "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".**"); + "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals( @@ -1000,7 +1004,7 @@ public class IoTDBTableIT { .getConnection("testUser", "testUser123456", BaseEnv.TABLE_SQL_DIALECT); final Statement statement = connection.createStatement()) { statement.execute( - "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".**"); + "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals( @@ -1020,7 +1024,7 @@ public class IoTDBTableIT { .getConnection("testUser", "testUser123456", BaseEnv.TABLE_SQL_DIALECT); final Statement statement = connection.createStatement()) { statement.execute( - "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".**"); + "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".\"1\".**"); fail(); } catch (final SQLException e) { assertEquals( @@ -1040,7 +1044,7 @@ public class IoTDBTableIT { .getConnection("testUser", "testUser123456", BaseEnv.TABLE_SQL_DIALECT); final Statement statement = connection.createStatement()) { statement.execute( - "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".**"); + "create or replace view tree_view_db.view_table (tag1 tag, tag2 tag, s11 int32 field, s3 from s2) restrict with (ttl=100) as root.\"重庆\".\"1\".**"); } catch (final SQLException e) { fail(); } @@ -1059,14 +1063,14 @@ public class IoTDBTableIT { statement.executeQuery("show create view view_table"), "View,Create View,", Collections.singleton( - "view_table,CREATE VIEW \"view_table\" (\"tag1\" STRING TAG,\"tag2\" STRING TAG,\"s11\" INT32 FIELD,\"s3\" STRING FIELD FROM \"s2\") RESTRICT WITH (ttl=100) AS root.\"重庆\".**,")); + "view_table,CREATE VIEW \"view_table\" (\"tag1\" STRING TAG,\"tag2\" STRING TAG,\"s11\" INT32 FIELD,\"s3\" STRING FIELD FROM \"s2\") RESTRICT WITH (ttl=100) AS root.\"重庆\".\"1\".**,")); // Can also use "show create table" TestUtils.assertResultSetEqual( statement.executeQuery("show create table view_table"), "View,Create View,", Collections.singleton( - "view_table,CREATE VIEW \"view_table\" (\"tag1\" STRING TAG,\"tag2\" STRING TAG,\"s11\" INT32 FIELD,\"s3\" STRING FIELD FROM \"s2\") RESTRICT WITH (ttl=100) AS root.\"重庆\".**,")); + "view_table,CREATE VIEW \"view_table\" (\"tag1\" STRING TAG,\"tag2\" STRING TAG,\"s11\" INT32 FIELD,\"s3\" STRING FIELD FROM \"s2\") RESTRICT WITH (ttl=100) AS root.\"重庆\".\"1\".**,")); statement.execute("create table a ()"); try { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeaderFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeaderFactory.java index a9e737ac06e..221483ee603 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeaderFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeaderFactory.java @@ -56,7 +56,7 @@ public class DatasetHeaderFactory { } public static DatasetHeader getShowDevicesWithSgHeader() { - return new DatasetHeader(ColumnHeaderConstant.showDevicesWithSgColumnHeaders, true); + return new DatasetHeader(ColumnHeaderConstant.showDevicesWithDbColumnHeaders, true); } public static DatasetHeader getShowDatabaseHeader(final boolean isDetailed) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceSchemaSource.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceSchemaSource.java index c655cf9eae4..f9f1f53c83d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceSchemaSource.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/schema/source/DeviceSchemaSource.java @@ -89,7 +89,7 @@ public class DeviceSchemaSource implements ISchemaSource<IDeviceSchemaInfo> { @Override public List<ColumnHeader> getInfoQueryColumnHeaders() { return hasSgCol - ? ColumnHeaderConstant.showDevicesWithSgColumnHeaders + ? ColumnHeaderConstant.showDevicesWithDbColumnHeaders : ColumnHeaderConstant.showDevicesColumnHeaders; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowCreateViewTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowCreateViewTask.java index a0c8325b864..f4a8578c1e7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowCreateViewTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowCreateViewTask.java @@ -146,7 +146,7 @@ public class ShowCreateViewTask extends AbstractTableTask { final String[] pathNodes = TreeViewSchema.getPrefixPattern(table).getNodes(); builder.append(pathNodes[0]); for (int i = 1; i < pathNodes.length - 1; ++i) { - builder.append(".\"").append(pathNodes[i]).append("\""); + builder.append(".\"").append(pathNodes[i].replace("`", "")).append("\""); } builder.append(".").append(pathNodes[pathNodes.length - 1]); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java index 4668b25c4c1..277daf643f3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/OperatorTreeGenerator.java @@ -932,7 +932,7 @@ public class OperatorTreeGenerator extends PlanVisitor<Operator, LocalExecutionP node.isPrefixPath(), node.getLimit(), node.getOffset(), - node.isHasSgCol(), + node.isHasDbCol(), node.getSchemaFilter(), node.getScope())); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metadata/read/DevicesSchemaScanNode.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metadata/read/DevicesSchemaScanNode.java index e7c5067c4e3..d76e74d9d7a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metadata/read/DevicesSchemaScanNode.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/metadata/read/DevicesSchemaScanNode.java @@ -40,7 +40,7 @@ import java.util.stream.Collectors; public class DevicesSchemaScanNode extends SchemaQueryScanNode { - private final boolean hasSgCol; + private final boolean hasDbCol; private final SchemaFilter schemaFilter; public DevicesSchemaScanNode( @@ -49,16 +49,16 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode { long limit, long offset, boolean isPrefixPath, - boolean hasSgCol, + boolean hasDbCol, SchemaFilter schemaFilter, PathPatternTree scope) { super(id, path, limit, offset, isPrefixPath, scope); - this.hasSgCol = hasSgCol; + this.hasDbCol = hasDbCol; this.schemaFilter = schemaFilter; } - public boolean isHasSgCol() { - return hasSgCol; + public boolean isHasDbCol() { + return hasDbCol; } public SchemaFilter getSchemaFilter() { @@ -73,13 +73,13 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode { @Override public PlanNode clone() { return new DevicesSchemaScanNode( - getPlanNodeId(), path, limit, offset, isPrefixPath, hasSgCol, schemaFilter, scope); + getPlanNodeId(), path, limit, offset, isPrefixPath, hasDbCol, schemaFilter, scope); } @Override public List<String> getOutputColumnNames() { - if (hasSgCol) { - return ColumnHeaderConstant.showDevicesWithSgColumnHeaders.stream() + if (hasDbCol) { + return ColumnHeaderConstant.showDevicesWithDbColumnHeaders.stream() .map(ColumnHeader::getColumnName) .collect(Collectors.toList()); } @@ -96,7 +96,7 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode { ReadWriteIOUtils.write(limit, byteBuffer); ReadWriteIOUtils.write(offset, byteBuffer); ReadWriteIOUtils.write(isPrefixPath, byteBuffer); - ReadWriteIOUtils.write(hasSgCol, byteBuffer); + ReadWriteIOUtils.write(hasDbCol, byteBuffer); SchemaFilter.serialize(schemaFilter, byteBuffer); } @@ -108,7 +108,7 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode { ReadWriteIOUtils.write(limit, stream); ReadWriteIOUtils.write(offset, stream); ReadWriteIOUtils.write(isPrefixPath, stream); - ReadWriteIOUtils.write(hasSgCol, stream); + ReadWriteIOUtils.write(hasDbCol, stream); SchemaFilter.serialize(schemaFilter, stream); } @@ -143,12 +143,12 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode { return false; } DevicesSchemaScanNode that = (DevicesSchemaScanNode) o; - return hasSgCol == that.hasSgCol && Objects.equals(schemaFilter, that.schemaFilter); + return hasDbCol == that.hasDbCol && Objects.equals(schemaFilter, that.schemaFilter); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), hasSgCol, schemaFilter); + return Objects.hash(super.hashCode(), hasDbCol, schemaFilter); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java index 643f5364faa..5c9f94543d5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java @@ -351,17 +351,17 @@ public class TableDeviceSchemaFetcher { final Map<String, List<DeviceEntry>> deviceEntryMap, final String database, final TsTable tableInstance, - final Map<Integer, List<SchemaFilter>> idFilters, + final Map<Integer, List<SchemaFilter>> tagFilters, final Predicate<AlignedDeviceEntry> check, final List<String> attributeColumns, final List<IDeviceID> fetchPaths, final boolean isDirectDeviceQuery, final MPPQueryContext queryContext) { - final String[] idValues = new String[tableInstance.getTagNum()]; - for (final List<SchemaFilter> schemaFilters : idFilters.values()) { + final String[] tagValues = new String[tableInstance.getTagNum()]; + for (final List<SchemaFilter> schemaFilters : tagFilters.values()) { final TagFilter tagFilter = (TagFilter) schemaFilters.get(0); final SchemaFilter childFilter = tagFilter.getChild(); - idValues[tagFilter.getIndex()] = ((PreciseFilter) childFilter).getValue(); + tagValues[tagFilter.getIndex()] = ((PreciseFilter) childFilter).getValue(); } return !TreeViewSchema.isTreeViewTable(tableInstance) @@ -373,9 +373,9 @@ public class TableDeviceSchemaFetcher { attributeColumns, fetchPaths, isDirectDeviceQuery, - idValues, + tagValues, queryContext) - : tryGetTreeDeviceInCache(deviceEntryMap, tableInstance, check, fetchPaths, idValues); + : tryGetTreeDeviceInCache(deviceEntryMap, tableInstance, check, fetchPaths, tagValues); } private boolean tryGetTableDeviceInCache( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java index 327b5703b4e..cf2d47492f2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/ast/AbstractQueryDeviceWithCache.java @@ -61,16 +61,20 @@ public abstract class AbstractQueryDeviceWithCache extends AbstractTraverseDevic if (Objects.isNull(where)) { return true; } - final Map<String, List<DeviceEntry>> entries = new HashMap<>(); - entries.put(database, new ArrayList<>()); + final Map<String, List<DeviceEntry>> hitCacheEntries = new HashMap<>(); + hitCacheEntries.put(database, new ArrayList<>()); final boolean needFetch = - super.parseRawExpression(entries, tableInstance, attributeColumns, context); + super.parseRawExpression(hitCacheEntries, tableInstance, attributeColumns, context); if (!needFetch) { context.reserveMemoryForFrontEnd( - entries.get(database).stream().map(DeviceEntry::ramBytesUsed).reduce(0L, Long::sum)); + hitCacheEntries.values().stream() + .flatMap(List::stream) + .map(DeviceEntry::ramBytesUsed) + .reduce(0L, Long::sum)); results = - entries.get(database).stream() + hitCacheEntries.values().stream() + .flatMap(List::stream) .map( deviceEntry -> ShowDevicesResult.convertDeviceEntry2ShowDeviceResult( 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 644a8de0472..6364b8adb59 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 @@ -22,6 +22,7 @@ package org.apache.iotdb.db.queryengine.plan.relational.sql.parser; import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType; import org.apache.iotdb.commons.auth.entity.PrivilegeType; import org.apache.iotdb.commons.cluster.NodeStatus; +import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.schema.cache.CacheClearOptions; import org.apache.iotdb.commons.schema.table.InformationSchema; @@ -704,17 +705,26 @@ public class AstBuilder extends RelationalSqlBaseVisitor<Node> { private PartialPath parsePrefixPath(final RelationalSqlParser.PrefixPathContext ctx) { final List<RelationalSqlParser.NodeNameContext> nodeNames = ctx.nodeName(); - final String[] path = new String[nodeNames.size() + 1]; - path[0] = ctx.ROOT().getText(); + final StringBuilder builder = new StringBuilder("root."); for (int i = 0; i < nodeNames.size(); i++) { - path[i + 1] = - parseNodeString( - nodeNames.get(i).nodeNameWithoutWildcard() != null - ? ((Identifier) visit(nodeNames.get(i).nodeNameWithoutWildcard().identifier())) - .getValue() - : nodeNames.get(i).getText()); - } - return new PartialPath(path); + if (nodeNames.get(i).nodeNameWithoutWildcard() != null) { + builder + .append("`") + .append( + parseNodeString( + ((Identifier) visit(nodeNames.get(i).nodeNameWithoutWildcard().identifier())) + .getValue())) + .append("`") + .append(i == nodeNames.size() - 1 ? "" : "."); + } else { + builder.append(nodeNames.get(i).getText()); + } + } + try { + return new PartialPath(builder.toString()); + } catch (final IllegalPathException e) { + throw new SemanticException(e); + } } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/read/resp/info/impl/ShowDevicesResult.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/read/resp/info/impl/ShowDevicesResult.java index ce805798715..eb098ac8c8f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/read/resp/info/impl/ShowDevicesResult.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/read/resp/info/impl/ShowDevicesResult.java @@ -34,8 +34,9 @@ import java.util.Objects; import java.util.function.Function; public class ShowDevicesResult extends ShowSchemaResult implements IDeviceSchemaInfo { - private Boolean isAligned; - private int templateId; + + private final Boolean isAligned; + private final int templateId; private Function<String, Binary> attributeProvider; diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java index 83efa9162aa..31de153d287 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java @@ -580,7 +580,7 @@ public class SchemaQueryLogicalPlannerTest { (DevicesSchemaScanNode) metaMergeNode.getChildren().get(0); Assert.assertNotNull(showDevicesNode); Assert.assertEquals(new PartialPath("root.ln.wf01.wt01"), showDevicesNode.getPath()); - Assert.assertTrue(showDevicesNode.isHasSgCol()); + Assert.assertTrue(showDevicesNode.isHasDbCol()); Assert.assertEquals(30, showDevicesNode.getLimit()); Assert.assertEquals(0, showDevicesNode.getOffset()); Assert.assertTrue(showDevicesNode.isHasLimit()); @@ -613,7 +613,7 @@ public class SchemaQueryLogicalPlannerTest { (DevicesSchemaScanNode) metaMergeNode.getChildren().get(0); Assert.assertNotNull(showDevicesNode); Assert.assertEquals(new PartialPath("root.ln.wf01.wt01"), showDevicesNode.getPath()); - Assert.assertFalse(showDevicesNode.isHasSgCol()); + Assert.assertFalse(showDevicesNode.isHasDbCol()); Assert.assertEquals( SchemaFilterType.PATH_CONTAINS, showDevicesNode.getSchemaFilter().getSchemaFilterType()); Assert.assertEquals( @@ -630,7 +630,7 @@ public class SchemaQueryLogicalPlannerTest { (DevicesSchemaScanNode) PlanNodeType.deserialize(byteBuffer); Assert.assertNotNull(showDevicesNode2); Assert.assertEquals(new PartialPath("root.ln.wf01.wt01"), showDevicesNode2.getPath()); - Assert.assertFalse(showDevicesNode2.isHasSgCol()); + Assert.assertFalse(showDevicesNode2.isHasDbCol()); Assert.assertEquals( SchemaFilterType.PATH_CONTAINS, showDevicesNode2.getSchemaFilter().getSchemaFilterType()); Assert.assertEquals( diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java index 145cb7774fa..aaf2f5f7107 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java @@ -340,7 +340,7 @@ public class ColumnHeaderConstant { new ColumnHeader(DEADBAND_PARAMETERS, TSDataType.TEXT), new ColumnHeader(VIEW_TYPE, TSDataType.TEXT)); - public static final List<ColumnHeader> showDevicesWithSgColumnHeaders = + public static final List<ColumnHeader> showDevicesWithDbColumnHeaders = ImmutableList.of( new ColumnHeader(DEVICE, TSDataType.TEXT), new ColumnHeader(DATABASE, TSDataType.TEXT),
