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)
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 96f0a9d..b6617ec 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 @@ "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 @@ 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 @@ @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 54881fb..96fe00d 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 @@ 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 @@ "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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ // 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 @@ 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,12 +942,16 @@ 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),", Collections.singleton("3,")); @@ -958,7 +962,7 @@ 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 @@ .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 @@ .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 @@ .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 @@ .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 @@ 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 a9e737a..221483e 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 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 c655cf9..f9f1f53 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 @@ @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 a0c8325..f4a8578 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 @@ 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 4668b25..277daf6 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 @@ 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 e7c5067..d76e74d 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 @@ public class DevicesSchemaScanNode extends SchemaQueryScanNode { - private final boolean hasSgCol; + private final boolean hasDbCol; private final SchemaFilter schemaFilter; public DevicesSchemaScanNode( @@ -49,16 +49,16 @@ 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 @@ @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 @@ 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 @@ 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 @@ 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 643f536..5c9f945 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 @@ 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 @@ 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 327b570..cf2d474 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 @@ 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 644a8de0..6364b8a 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 @@ 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 @@ 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()); + 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()); + } } - return new PartialPath(path); + 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 ce80579..eb098ac 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.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 83efa91..31de153 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 @@ (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 @@ (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 @@ (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 145cb77..aaf2f5f 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 @@ 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),