Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,51 @@ public void testManageDatabase() {
}
}

@Test
public void testShowCreateDatabase() throws SQLException {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

testShowCreateDatabase asserts exact CREATE DATABASE text including region group defaults. If defaults change between releases, consider matching on key substrings to reduce brittle IT failures.

try (final Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement statement = connection.createStatement()) {
statement.execute(
"create database test_show_create_db with (ttl=300, schema_region_group_num=DEFAULT, data_region_group_num=DEFAULT, time_partition_interval=100000)");

TestUtils.assertResultSetEqual(
statement.executeQuery("show create database test_show_create_db"),
"Database,Create Database,",
Collections.singleton(
"test_show_create_db,CREATE DATABASE \"test_show_create_db\" WITH (ttl=300,time_partition_interval=100000,schema_region_group_num=1,data_region_group_num=2),"));
}
}

@Test
public void testShowCreatePipe() throws SQLException {
try (final Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement statement = connection.createStatement()) {
statement.execute("create pipe test_show_create_pipe ('sink'='do-nothing-sink')");

TestUtils.assertResultSetEqual(
statement.executeQuery("show create pipe test_show_create_pipe"),
"Pipe,Create Pipe,",
Collections.singleton(
"test_show_create_pipe,CREATE PIPE \"test_show_create_pipe\" WITH SINK ('sink'='do-nothing-sink'),"));
}
}

@Test
public void testShowCreateInformationSchemaDatabase() throws SQLException {
try (final Connection connection =
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement statement = connection.createStatement()) {
try {
statement.executeQuery("show create database information_schema");
fail("show create database information_schema shouldn't succeed");
} catch (final SQLException e) {
assertEquals("701: The system database does not support show create.", e.getMessage());
}
}
}

@Test
public void testDatabaseWithSpecificCharacters() throws SQLException {
try (final Connection connection =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.apache.iotdb.isession.ITableSession;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.MultiClusterIT2SubscriptionTableArchVerification;
import org.apache.iotdb.itbase.env.BaseEnv;
import org.apache.iotdb.pipe.it.dual.tablemodel.TableModelUtils;
import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.subscription.config.TopicConstant;
Expand All @@ -52,6 +53,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.Statement;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Properties;
Expand Down Expand Up @@ -97,6 +101,29 @@ protected void setUpConfig() {
.setIsPipeEnableMemoryCheck(false);
}

@Ignore
@Test
public void testShowCreateTopic() throws Exception {
TableModelUtils.createDataBaseAndTable(
senderEnv, "test_show_create_topic_db", "test_show_create_topic_table");

try (final Connection connection = senderEnv.getConnection(BaseEnv.TABLE_SQL_DIALECT);
final Statement statement = connection.createStatement()) {
statement.execute(
"create topic test_show_create_topic with ('database'='test_show_create_topic_db','table'='test_show_create_topic_table','format'='"
+ TopicConstant.FORMAT_TS_FILE_VALUE
+ "')");

TestUtils.assertResultSetEqual(
statement.executeQuery("show create topic test_show_create_topic"),
"Topic,Create Topic,",
Collections.singleton(
"test_show_create_topic,CREATE TOPIC \"test_show_create_topic\" WITH ('database'='test_show_create_topic_db','format'='"
+ TopicConstant.FORMAT_TS_FILE_VALUE
+ "','table'='test_show_create_topic_table'),"));
}
}

@Ignore
@Test
public void testTabletTopicWithPath() throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ ddlStatement
// Pipe Plugin
| createPipePlugin | dropPipePlugin | showPipePlugins
// Subscription
| createTopic | dropTopic | showTopics | showSubscriptions | dropSubscription
| createTopic | dropTopic | showTopics | showCreateTopic | showSubscriptions | dropSubscription
// CQ
| createContinuousQuery | dropContinuousQuery | showContinuousQueries
// Cluster
Expand Down Expand Up @@ -736,6 +736,10 @@ showTopics
: SHOW ((TOPIC topicName=identifier) | TOPICS )
;

showCreateTopic
: SHOW CREATE TOPIC topicName=identifier
;

showSubscriptions
: SHOW SUBSCRIPTIONS (ON topicName=identifier)?
;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,18 @@ public static DatasetHeader getShowCreateTableColumnHeader() {
return new DatasetHeader(ColumnHeaderConstant.showCreateTableColumnHeaders, true);
}

public static DatasetHeader getShowCreatePipeColumnHeader() {
return new DatasetHeader(ColumnHeaderConstant.showCreatePipeColumnHeaders, true);
}

public static DatasetHeader getShowCreateTopicColumnHeader() {
return new DatasetHeader(ColumnHeaderConstant.showCreateTopicColumnHeaders, true);
}

public static DatasetHeader getShowCreateDatabaseColumnHeader() {
return new DatasetHeader(ColumnHeaderConstant.showCreateDatabaseColumnHeaders, true);
}

public static DatasetHeader getShowTablesHeader() {
return new DatasetHeader(ColumnHeaderConstant.showTablesColumnHeaders, true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowClusterId;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfiguration;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreateDatabase;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentDatabase;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentSqlDialect;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentTimestamp;
Expand Down Expand Up @@ -613,6 +614,7 @@ private IQueryExecution createQueryExecutionForTableModel(
if (statement instanceof DropDB
|| statement instanceof CountDB
|| statement instanceof ShowDB
|| statement instanceof ShowCreateDatabase
|| statement instanceof CreateDB
|| statement instanceof AlterDB
|| statement instanceof Use
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.RelationalAuthorizerTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowAINodesTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowConfigNodesTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowCreateDatabaseTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowCreatePipeTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowCreateTableTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowCreateViewTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.ShowDBTask;
Expand Down Expand Up @@ -143,6 +145,7 @@
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.CreateTopicTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropSubscriptionTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropTopicTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowCreateTopicTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowSubscriptionsTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask;
import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analyzer;
Expand Down Expand Up @@ -211,6 +214,9 @@
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowClusterId;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfigNodes;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowConfiguration;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreateDatabase;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreatePipe;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCreateTopic;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentDatabase;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentSqlDialect;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowCurrentTimestamp;
Expand Down Expand Up @@ -426,6 +432,15 @@ public IConfigTask visitShowDB(final ShowDB node, final MPPQueryContext context)
canShowDB(accessControl, context.getSession().getUserName(), databaseName, context));
}

@Override
public IConfigTask visitShowCreateDatabase(
final ShowCreateDatabase node, final MPPQueryContext context) {
context.setQueryType(QueryType.READ);
accessControl.checkCanShowOrUseDatabase(
context.getSession().getUserName(), node.getDatabase(), context);
return new ShowCreateDatabaseTask(node.getDatabase());
}

@Override
public IConfigTask visitCountDB(final CountDB node, final MPPQueryContext context) {
context.setQueryType(QueryType.READ);
Expand Down Expand Up @@ -1200,6 +1215,8 @@ public static void checkAndEnrichSourceUser(
PipeSourceConstant.SOURCE_IOTDB_USERNAME_KEY, userEntity.getUsername());
replacedSourceAttributes.put(
PipeSourceConstant.SOURCE_IOTDB_CLI_HOSTNAME, userEntity.getCliHostname());
replacedSourceAttributes.put(
SystemConstant.SOURCE_AUTHENTICATION_INJECTED_KEY, Boolean.TRUE.toString());
} else if (!sourceParameters.hasAnyAttributes(
PipeSourceConstant.EXTRACTOR_IOTDB_PASSWORD_KEY,
PipeSourceConstant.SOURCE_IOTDB_PASSWORD_KEY)) {
Expand Down Expand Up @@ -1269,6 +1286,8 @@ public static void checkAndEnrichSinkUser(
connectorAttributes.put(PipeSinkConstant.SINK_IOTDB_USERNAME_KEY, userEntity.getUsername());
connectorAttributes.put(
PipeSinkConstant.SINK_IOTDB_CLI_HOSTNAME, userEntity.getCliHostname());
connectorAttributes.put(
SystemConstant.SINK_AUTHENTICATION_INJECTED_KEY, Boolean.TRUE.toString());
} else if (!connectorParameters.hasAnyAttributes(
PipeSinkConstant.CONNECTOR_IOTDB_PASSWORD_KEY, PipeSinkConstant.SINK_IOTDB_PASSWORD_KEY)) {
throw new SemanticException(
Expand Down Expand Up @@ -1311,6 +1330,8 @@ public IConfigTask visitAlterPipe(final AlterPipe node, final MPPQueryContext co
extractorAttributes,
new UserEntity(context.getUserId(), context.getUsername(), context.getCliHostname()),
true);
} else {
markSourceAuthenticationAsExplicitIfNecessary(extractorAttributes);
}
mayChangeSourcePattern(extractorAttributes);

Expand All @@ -1320,11 +1341,42 @@ public IConfigTask visitAlterPipe(final AlterPipe node, final MPPQueryContext co
node.getConnectorAttributes(),
new UserEntity(context.getUserId(), context.getUsername(), context.getCliHostname()),
true);
} else {
markSinkAuthenticationAsExplicitIfNecessary(node.getConnectorAttributes());
}

return new AlterPipeTask(node, userName);
}

public static void markSourceAuthenticationAsExplicitIfNecessary(
final Map<String, String> sourceAttributes) {
final PipeParameters sourceParameters = new PipeParameters(sourceAttributes);
if (sourceParameters.hasAnyAttributes(
PipeSourceConstant.EXTRACTOR_IOTDB_USER_KEY,
PipeSourceConstant.SOURCE_IOTDB_USER_KEY,
PipeSourceConstant.EXTRACTOR_IOTDB_USERNAME_KEY,
PipeSourceConstant.SOURCE_IOTDB_USERNAME_KEY,
PipeSourceConstant.EXTRACTOR_IOTDB_PASSWORD_KEY,
PipeSourceConstant.SOURCE_IOTDB_PASSWORD_KEY)) {
sourceAttributes.put(
SystemConstant.SOURCE_AUTHENTICATION_INJECTED_KEY, Boolean.FALSE.toString());
}
}

public static void markSinkAuthenticationAsExplicitIfNecessary(
final Map<String, String> sinkAttributes) {
final PipeParameters sinkParameters = new PipeParameters(sinkAttributes);
if (sinkParameters.hasAnyAttributes(
PipeSinkConstant.CONNECTOR_IOTDB_USER_KEY,
PipeSinkConstant.SINK_IOTDB_USER_KEY,
PipeSinkConstant.CONNECTOR_IOTDB_USERNAME_KEY,
PipeSinkConstant.SINK_IOTDB_USERNAME_KEY,
PipeSinkConstant.CONNECTOR_IOTDB_PASSWORD_KEY,
PipeSinkConstant.SINK_IOTDB_PASSWORD_KEY)) {
sinkAttributes.put(SystemConstant.SINK_AUTHENTICATION_INJECTED_KEY, Boolean.FALSE.toString());
}
}

@Override
public IConfigTask visitDropPipe(DropPipe node, MPPQueryContext context) {
context.setQueryType(QueryType.OTHER);
Expand Down Expand Up @@ -1352,6 +1404,19 @@ public IConfigTask visitShowPipes(ShowPipes node, MPPQueryContext context) {
return new ShowPipeTask(node, context.getSession().getUserName());
}

@Override
public IConfigTask visitShowCreatePipe(ShowCreatePipe node, MPPQueryContext context) {
context.setQueryType(QueryType.READ);
return new ShowCreatePipeTask(node.getPipeName(), context.getSession().getUserName());
}

@Override
public IConfigTask visitShowCreateTopic(ShowCreateTopic node, MPPQueryContext context) {
context.setQueryType(QueryType.READ);
accessControl.checkUserGlobalSysPrivilege(context);
return new ShowCreateTopicTask(node);
}

@Override
public IConfigTask visitCreatePipePlugin(CreatePipePlugin node, MPPQueryContext context) {
context.setQueryType(QueryType.OTHER);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.CreateTopicTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropSubscriptionTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.DropTopicTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowCreateTopicTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowSubscriptionsTask;
import org.apache.iotdb.db.queryengine.plan.execution.config.sys.subscription.ShowTopicsTask;
import org.apache.iotdb.db.queryengine.plan.statement.AuthorType;
Expand Down Expand Up @@ -195,6 +196,7 @@
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.CreateTopicStatement;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropSubscriptionStatement;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.DropTopicStatement;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowCreateTopicStatement;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowSubscriptionsStatement;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.subscription.ShowTopicsStatement;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.template.AlterSchemaTemplateStatement;
Expand Down Expand Up @@ -241,6 +243,8 @@
import static org.apache.iotdb.commons.executable.ExecutableManager.isUriTrusted;
import static org.apache.iotdb.db.queryengine.plan.execution.config.TableConfigTaskVisitor.checkAndEnrichSinkUser;
import static org.apache.iotdb.db.queryengine.plan.execution.config.TableConfigTaskVisitor.checkAndEnrichSourceUser;
import static org.apache.iotdb.db.queryengine.plan.execution.config.TableConfigTaskVisitor.markSinkAuthenticationAsExplicitIfNecessary;
import static org.apache.iotdb.db.queryengine.plan.execution.config.TableConfigTaskVisitor.markSourceAuthenticationAsExplicitIfNecessary;

public class TreeConfigTaskVisitor extends StatementVisitor<IConfigTask, MPPQueryContext> {

Expand Down Expand Up @@ -696,6 +700,8 @@ public IConfigTask visitAlterPipe(
sourceAttributes,
new UserEntity(context.getUserId(), context.getUsername(), context.getCliHostname()),
true);
} else {
markSourceAuthenticationAsExplicitIfNecessary(sourceAttributes);
}

if (alterPipeStatement.isReplaceAllSinkAttributes()) {
Expand All @@ -704,6 +710,8 @@ public IConfigTask visitAlterPipe(
alterPipeStatement.getSinkAttributes(),
context.getSession().getUserEntity(),
true);
} else {
markSinkAuthenticationAsExplicitIfNecessary(alterPipeStatement.getSinkAttributes());
}

return new AlterPipeTask(alterPipeStatement);
Expand Down Expand Up @@ -742,6 +750,12 @@ public IConfigTask visitShowTopics(
return new ShowTopicsTask(showTopicsStatement);
}

@Override
public IConfigTask visitShowCreateTopic(
ShowCreateTopicStatement showCreateTopicStatement, MPPQueryContext context) {
return new ShowCreateTopicTask(showCreateTopicStatement);
}

@Override
public IConfigTask visitShowSubscriptions(
ShowSubscriptionsStatement showSubscriptionsStatement, MPPQueryContext context) {
Expand Down
Loading
Loading