Skip to content

Commit 5daceda

Browse files
committed
show create
1 parent aca2e13 commit 5daceda

22 files changed

Lines changed: 593 additions & 1 deletion

File tree

integration-test/src/test/java/org/apache/iotdb/subscription/it/dual/tablemodel/IoTDBSubscriptionTopicIT.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.iotdb.isession.ITableSession;
2929
import org.apache.iotdb.it.framework.IoTDBTestRunner;
3030
import org.apache.iotdb.itbase.category.MultiClusterIT2SubscriptionTableArchVerification;
31+
import org.apache.iotdb.itbase.env.BaseEnv;
3132
import org.apache.iotdb.pipe.it.dual.tablemodel.TableModelUtils;
3233
import org.apache.iotdb.rpc.RpcUtils;
3334
import org.apache.iotdb.rpc.subscription.config.TopicConstant;
@@ -52,6 +53,9 @@
5253
import org.slf4j.Logger;
5354
import org.slf4j.LoggerFactory;
5455

56+
import java.sql.Connection;
57+
import java.sql.Statement;
58+
import java.util.Collections;
5559
import java.util.List;
5660
import java.util.Objects;
5761
import java.util.Properties;
@@ -97,6 +101,28 @@ protected void setUpConfig() {
97101
.setIsPipeEnableMemoryCheck(false);
98102
}
99103

104+
@Test
105+
public void testShowCreateTopic() throws Exception {
106+
TableModelUtils.createDataBaseAndTable(
107+
senderEnv, "test_show_create_topic_db", "test_show_create_topic_table");
108+
109+
try (final Connection connection = senderEnv.getConnection(BaseEnv.TABLE_SQL_DIALECT);
110+
final Statement statement = connection.createStatement()) {
111+
statement.execute(
112+
"create topic test_show_create_topic with ('database'='test_show_create_topic_db','table'='test_show_create_topic_table','format'='"
113+
+ TopicConstant.FORMAT_TS_FILE_VALUE
114+
+ "')");
115+
116+
TestUtils.assertResultSetEqual(
117+
statement.executeQuery("show create topic test_show_create_topic"),
118+
"Topic,Create Topic,",
119+
Collections.singleton(
120+
"test_show_create_topic,CREATE TOPIC \"test_show_create_topic\" WITH ('database'='test_show_create_topic_db','format'='"
121+
+ TopicConstant.FORMAT_TS_FILE_VALUE
122+
+ "','table'='test_show_create_topic_table'),"));
123+
}
124+
}
125+
100126
@Ignore
101127
@Test
102128
public void testTabletTopicWithPath() throws Exception {

iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ ddlStatement
5959
// Pipe Plugin
6060
| createPipePlugin | dropPipePlugin | showPipePlugins
6161
// Subscription
62-
| createTopic | dropTopic | showTopics | showSubscriptions | dropSubscription
62+
| createTopic | dropTopic | showTopics | showCreateTopic | showSubscriptions | dropSubscription
6363
// CQ
6464
| createContinuousQuery | dropContinuousQuery | showContinuousQueries
6565
// Cluster
@@ -734,6 +734,10 @@ showTopics
734734
: SHOW ((TOPIC topicName=identifier) | TOPICS )
735735
;
736736

737+
showCreateTopic
738+
: SHOW CREATE TOPIC topicName=identifier
739+
;
740+
737741
showSubscriptions
738742
: SHOW SUBSCRIPTIONS (ON topicName=identifier)?
739743
;

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/DatasetHeaderFactory.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ public static DatasetHeader getShowCreatePipeColumnHeader() {
267267
return new DatasetHeader(ColumnHeaderConstant.showCreatePipeColumnHeaders, true);
268268
}
269269

270+
public static DatasetHeader getShowCreateTopicColumnHeader() {
271+
return new DatasetHeader(ColumnHeaderConstant.showCreateTopicColumnHeaders, true);
272+
}
273+
270274
public static DatasetHeader getShowCreateDatabaseColumnHeader() {
271275
return new DatasetHeader(ColumnHeaderConstant.showCreateDatabaseColumnHeaders, true);
272276
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.CreateTopicTask;
145145
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropSubscriptionTask;
146146
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropTopicTask;
147+
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowCreateTopicTask;
147148
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowSubscriptionsTask;
148149
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask;
149150
import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analyzer;
@@ -213,6 +214,7 @@
213214
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfiguration;
214215
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreateDatabase;
215216
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreatePipe;
217+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreateTopic;
216218
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentDatabase;
217219
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentSqlDialect;
218220
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentTimestamp;
@@ -1360,6 +1362,13 @@ public IConfigTask visitShowCreatePipe(ShowCreatePipe node, MPPQueryContext cont
13601362
return new ShowCreatePipeTask(node.getPipeName(), context.getSession().getUserName());
13611363
}
13621364

1365+
@Override
1366+
public IConfigTask visitShowCreateTopic(ShowCreateTopic node, MPPQueryContext context) {
1367+
context.setQueryType(QueryType.READ);
1368+
accessControl.checkUserGlobalSysPrivilege(context);
1369+
return new ShowCreateTopicTask(node);
1370+
}
1371+
13631372
@Override
13641373
public IConfigTask visitCreatePipePlugin(CreatePipePlugin node, MPPQueryContext context) {
13651374
context.setQueryType(QueryType.OTHER);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TreeConfigTaskVisitor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.CreateTopicTask;
127127
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropSubscriptionTask;
128128
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropTopicTask;
129+
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowCreateTopicTask;
129130
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowSubscriptionsTask;
130131
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask;
131132
import org.apache.iotdb.db.queryengine.plan.statement.AuthorType;
@@ -195,6 +196,7 @@
195196
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
196197
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropSubscriptionStatement;
197198
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
199+
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowCreateTopicStatement;
198200
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
199201
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowTopicsStatement;
200202
import org.apache.iotdb.db.queryengine.plan.statement.metadata.template.AlterSchemaTemplateStatement;
@@ -742,6 +744,12 @@ public IConfigTask visitShowTopics(
742744
return new ShowTopicsTask(showTopicsStatement);
743745
}
744746

747+
@Override
748+
public IConfigTask visitShowCreateTopic(
749+
ShowCreateTopicStatement showCreateTopicStatement, MPPQueryContext context) {
750+
return new ShowCreateTopicTask(showCreateTopicStatement);
751+
}
752+
745753
@Override
746754
public IConfigTask visitShowSubscriptions(
747755
ShowSubscriptionsStatement showSubscriptionsStatement, MPPQueryContext context) {

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
import org.apache.iotdb.confignode.rpc.thrift.TExtendRegionReq;
139139
import org.apache.iotdb.confignode.rpc.thrift.TFetchTableResp;
140140
import org.apache.iotdb.confignode.rpc.thrift.TGetAllPipeInfoResp;
141+
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTopicInfoResp;
141142
import org.apache.iotdb.confignode.rpc.thrift.TGetDatabaseReq;
142143
import org.apache.iotdb.confignode.rpc.thrift.TGetPipePluginTableResp;
143144
import org.apache.iotdb.confignode.rpc.thrift.TGetRegionIdReq;
@@ -255,6 +256,7 @@
255256
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.pipe.ShowPipeTask;
256257
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.quota.ShowSpaceQuotaTask;
257258
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.quota.ShowThrottleQuotaTask;
259+
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowCreateTopicTask;
258260
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowSubscriptionsTask;
259261
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask;
260262
import org.apache.iotdb.db.queryengine.plan.expression.Expression;
@@ -297,6 +299,7 @@
297299
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
298300
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropSubscriptionStatement;
299301
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
302+
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowCreateTopicStatement;
300303
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
301304
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowTopicsStatement;
302305
import org.apache.iotdb.db.queryengine.plan.statement.metadata.template.AlterSchemaTemplateStatement;
@@ -3002,6 +3005,49 @@ public SettableFuture<ConfigTaskResult> showTopics(
30023005
return future;
30033006
}
30043007

3008+
@Override
3009+
public SettableFuture<ConfigTaskResult> showCreateTopic(
3010+
final ShowCreateTopicStatement showCreateTopicStatement) {
3011+
if (!SubscriptionConfig.getInstance().getSubscriptionEnabled()) {
3012+
return SUBSCRIPTION_NOT_ENABLED_ERROR_FUTURE;
3013+
}
3014+
3015+
final SettableFuture<ConfigTaskResult> future = SettableFuture.create();
3016+
try (final ConfigNodeClient configNodeClient =
3017+
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
3018+
final TGetAllTopicInfoResp getAllTopicInfoResp = configNodeClient.getAllTopicInfo();
3019+
if (getAllTopicInfoResp.getStatus().getCode()
3020+
!= TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
3021+
future.setException(new IoTDBException(getAllTopicInfoResp.getStatus()));
3022+
return future;
3023+
}
3024+
3025+
final TopicMeta topicMeta =
3026+
getAllTopicInfoResp.getAllTopicInfo().stream()
3027+
.map(TopicMeta::deserialize)
3028+
.filter(
3029+
meta ->
3030+
meta.visibleUnder(showCreateTopicStatement.isTableModel())
3031+
&& meta.getTopicName().equals(showCreateTopicStatement.getTopicName()))
3032+
.findFirst()
3033+
.orElse(null);
3034+
if (topicMeta == null) {
3035+
future.setException(
3036+
new IoTDBException(
3037+
String.format(
3038+
"Failed to show create topic %s, the topic does not exist.",
3039+
showCreateTopicStatement.getTopicName()),
3040+
TSStatusCode.TOPIC_NOT_EXIST_ERROR.getStatusCode()));
3041+
return future;
3042+
}
3043+
3044+
ShowCreateTopicTask.buildTsBlock(topicMeta, showCreateTopicStatement.isTableModel(), future);
3045+
} catch (final Exception e) {
3046+
future.setException(e);
3047+
}
3048+
return future;
3049+
}
3050+
30053051
@Override
30063052
public SettableFuture<ConfigTaskResult> alterEncodingCompressor(
30073053
final String queryId,

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/IConfigTaskExecutor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
7979
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropSubscriptionStatement;
8080
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
81+
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowCreateTopicStatement;
8182
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
8283
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowTopicsStatement;
8384
import org.apache.iotdb.db.queryengine.plan.statement.metadata.template.AlterSchemaTemplateStatement;
@@ -248,6 +249,9 @@ SettableFuture<ConfigTaskResult> dropSubscription(
248249

249250
SettableFuture<ConfigTaskResult> showTopics(ShowTopicsStatement showTopicsStatement);
250251

252+
SettableFuture<ConfigTaskResult> showCreateTopic(
253+
ShowCreateTopicStatement showCreateTopicStatement);
254+
251255
SettableFuture<ConfigTaskResult> alterEncodingCompressor(
252256
String queryId, AlterEncodingCompressorStatement alterEncodingCompressorStatement);
253257

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription;
21+
22+
import org.apache.iotdb.commons.pipe.config.constant.SystemConstant;
23+
import org.apache.iotdb.commons.schema.column.ColumnHeader;
24+
import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant;
25+
import org.apache.iotdb.commons.subscription.meta.topic.TopicMeta;
26+
import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
27+
import org.apache.iotdb.db.queryengine.common.header.DatasetHeaderFactory;
28+
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
29+
import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask;
30+
import org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
31+
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowCreateTableTask;
32+
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreateTopic;
33+
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowCreateTopicStatement;
34+
import org.apache.iotdb.rpc.TSStatusCode;
35+
36+
import com.google.common.util.concurrent.ListenableFuture;
37+
import com.google.common.util.concurrent.SettableFuture;
38+
import org.apache.tsfile.common.conf.TSFileConfig;
39+
import org.apache.tsfile.enums.TSDataType;
40+
import org.apache.tsfile.read.common.block.TsBlockBuilder;
41+
import org.apache.tsfile.utils.Binary;
42+
43+
import java.util.ArrayList;
44+
import java.util.List;
45+
import java.util.Map;
46+
import java.util.TreeMap;
47+
import java.util.stream.Collectors;
48+
49+
public class ShowCreateTopicTask implements IConfigTask {
50+
51+
private final ShowCreateTopicStatement showCreateTopicStatement;
52+
53+
public ShowCreateTopicTask(final ShowCreateTopicStatement showCreateTopicStatement) {
54+
this.showCreateTopicStatement = showCreateTopicStatement;
55+
}
56+
57+
public ShowCreateTopicTask(final ShowCreateTopic showCreateTopic) {
58+
this.showCreateTopicStatement = new ShowCreateTopicStatement();
59+
this.showCreateTopicStatement.setTopicName(showCreateTopic.getTopicName());
60+
this.showCreateTopicStatement.setTableModel(true);
61+
}
62+
63+
@Override
64+
public ListenableFuture<ConfigTaskResult> execute(final IConfigTaskExecutor configTaskExecutor)
65+
throws InterruptedException {
66+
return configTaskExecutor.showCreateTopic(showCreateTopicStatement);
67+
}
68+
69+
public static void buildTsBlock(
70+
final TopicMeta topicMeta,
71+
final boolean isTableModel,
72+
final SettableFuture<ConfigTaskResult> future) {
73+
final List<TSDataType> outputDataTypes =
74+
ColumnHeaderConstant.showCreateTopicColumnHeaders.stream()
75+
.map(ColumnHeader::getColumnType)
76+
.collect(Collectors.toList());
77+
78+
final TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
79+
builder.getTimeColumnBuilder().writeLong(0L);
80+
builder
81+
.getColumnBuilder(0)
82+
.writeBinary(new Binary(topicMeta.getTopicName(), TSFileConfig.STRING_CHARSET));
83+
builder
84+
.getColumnBuilder(1)
85+
.writeBinary(
86+
new Binary(
87+
getShowCreateTopicSQL(topicMeta, isTableModel), TSFileConfig.STRING_CHARSET));
88+
builder.declarePosition();
89+
90+
final DatasetHeader datasetHeader = DatasetHeaderFactory.getShowCreateTopicColumnHeader();
91+
future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
92+
}
93+
94+
public static String getShowCreateTopicSQL(
95+
final TopicMeta topicMeta, final boolean isTableModel) {
96+
final StringBuilder builder =
97+
new StringBuilder("CREATE TOPIC ")
98+
.append(getTopicIdentifier(topicMeta.getTopicName(), isTableModel));
99+
100+
final Map<String, String> sanitizedAttributes =
101+
sanitizeTopicAttributes(topicMeta.getConfig().getAttribute());
102+
if (!sanitizedAttributes.isEmpty()) {
103+
final List<String> pairs = new ArrayList<>(sanitizedAttributes.size());
104+
for (final Map.Entry<String, String> entry : sanitizedAttributes.entrySet()) {
105+
pairs.add(
106+
ShowCreateTableTask.getString(entry.getKey())
107+
+ "="
108+
+ ShowCreateTableTask.getString(entry.getValue()));
109+
}
110+
builder.append(" WITH (").append(String.join(",", pairs)).append(")");
111+
}
112+
113+
return builder.toString();
114+
}
115+
116+
private static String getTopicIdentifier(final String topicName, final boolean isTableModel) {
117+
if (isTableModel) {
118+
return ShowCreateTableTask.getIdentifier(topicName);
119+
}
120+
return "`" + topicName.replace("`", "``") + "`";
121+
}
122+
123+
private static Map<String, String> sanitizeTopicAttributes(final Map<String, String> attributes) {
124+
final Map<String, String> result = new TreeMap<>(attributes);
125+
result
126+
.entrySet()
127+
.removeIf(entry -> entry.getKey().startsWith(SystemConstant.SYSTEM_PREFIX_KEY));
128+
result.entrySet().removeIf(entry -> entry.getKey().startsWith(SystemConstant.AUDIT_PREFIX_KEY));
129+
return result;
130+
}
131+
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@
217217
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
218218
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropSubscriptionStatement;
219219
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
220+
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowCreateTopicStatement;
220221
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
221222
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowTopicsStatement;
222223
import org.apache.iotdb.db.queryengine.plan.statement.metadata.template.ActivateTemplateStatement;
@@ -4463,6 +4464,20 @@ public Statement visitShowTopics(IoTDBSqlParser.ShowTopicsContext ctx) {
44634464
return showTopicsStatement;
44644465
}
44654466

4467+
@Override
4468+
public Statement visitShowCreateTopic(IoTDBSqlParser.ShowCreateTopicContext ctx) {
4469+
final ShowCreateTopicStatement showCreateTopicStatement = new ShowCreateTopicStatement();
4470+
4471+
if (ctx.topicName != null) {
4472+
showCreateTopicStatement.setTopicName(parseIdentifier(ctx.topicName.getText()));
4473+
} else {
4474+
throw new SemanticException(
4475+
"Not support for this sql in SHOW CREATE TOPIC, please enter topicName.");
4476+
}
4477+
4478+
return showCreateTopicStatement;
4479+
}
4480+
44664481
@Override
44674482
public Statement visitShowSubscriptions(IoTDBSqlParser.ShowSubscriptionsContext ctx) {
44684483
final ShowSubscriptionsStatement showSubscriptionsStatement = new ShowSubscriptionsStatement();

0 commit comments

Comments
 (0)