You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2024/07/09 02:57:48 UTC
(iotdb) branch ty/useXX updated (c312d332c66 -> 707b3fc8fdb)
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a change to branch ty/useXX
in repository https://gitbox.apache.org/repos/asf/iotdb.git
from c312d332c66 Merge remote-tracking branch 'origin/ty/TableModelGrammar' into ty/useXX
new 357c00b1e23 Add IT for show tables after drop database
add b301184f07a Subscription IT: fix data insertion logic in SubscriptionConsumerGroupIT (#12863)
add 180e8fb422b Fixed the bug that a table may be concurrently altered and cause unordered operations on dataNode table cache
new 0e56c7a094d Merge remote-tracking branch 'origin/ty/TableModelGrammar' into ty/useXX
new 707b3fc8fdb add TableModelSessionPoolExample and IT
The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
...mple.java => TableModelSessionPoolExample.java} | 61 ++++---
.../iotdb/it/env/cluster/env/AbstractEnv.java | 31 ++++
.../iotdb/it/env/remote/env/RemoteServerEnv.java | 36 ++++
.../java/org/apache/iotdb/itbase/env/BaseEnv.java | 5 +
.../relational/it/schema/IoTDBDatabaseIT.java | 21 ++-
.../iotdb/relational/it/schema/IoTDBTableIT.java | 14 +-
.../it/session/IoTDBTableModelSessionIT.java | 114 ++++++++++++
.../session/pool/IoTDBTableModelSessionPoolIT.java | 196 +++++++++++++++++++++
.../it/dual/IoTDBSubscriptionConsumerGroupIT.java | 48 ++---
.../apache/iotdb/isession/pool/ISessionPool.java | 3 +
.../org/apache/iotdb/session/pool/SessionPool.java | 1 +
.../iotdb/confignode/manager/ProcedureManager.java | 183 ++++++++++++++-----
.../impl/schema/DeleteDatabaseProcedure.java | 4 +
.../protocol/thrift/impl/ClientRPCServiceImpl.java | 6 +
.../config/executor/ClusterConfigTaskExecutor.java | 46 +++--
15 files changed, 660 insertions(+), 109 deletions(-)
copy example/session/src/main/java/org/apache/iotdb/{TableModelSessionExample.java => TableModelSessionPoolExample.java} (74%)
create mode 100644 integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBTableModelSessionIT.java
create mode 100644 integration-test/src/test/java/org/apache/iotdb/relational/it/session/pool/IoTDBTableModelSessionPoolIT.java
(iotdb) 01/03: Add IT for show tables after drop database
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch ty/useXX
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 357c00b1e239170b67290e836b3e721c4437dc34
Author: JackieTien97 <ja...@gmail.com>
AuthorDate: Tue Jul 9 09:27:13 2024 +0800
Add IT for show tables after drop database
---
.../java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java | 8 ++++++++
1 file changed, 8 insertions(+)
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 80ae31d9c54..8e74b7ced8a 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
@@ -240,6 +240,14 @@ public class IoTDBTableIT {
assertEquals("550: Table test3.table3 not exists.", e.getMessage());
}
+ statement.execute("drop database test1");
+
+ try {
+ statement.executeQuery("SHOW tables from test1");
+ } catch (SQLException e) {
+ assertEquals("500: Database test1 doesn't exists.", e.getMessage());
+ }
+
} catch (SQLException e) {
e.printStackTrace();
fail(e.getMessage());
(iotdb) 03/03: add TableModelSessionPoolExample and IT
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch ty/useXX
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 707b3fc8fdb3ead6d8b27579d06e1afd3d5e4722
Author: JackieTien97 <ja...@gmail.com>
AuthorDate: Tue Jul 9 10:57:28 2024 +0800
add TableModelSessionPoolExample and IT
---
.../apache/iotdb/TableModelSessionPoolExample.java | 147 ++++++++++++++++
.../iotdb/it/env/cluster/env/AbstractEnv.java | 31 ++++
.../iotdb/it/env/remote/env/RemoteServerEnv.java | 36 ++++
.../java/org/apache/iotdb/itbase/env/BaseEnv.java | 5 +
.../relational/it/schema/IoTDBDatabaseIT.java | 21 ++-
.../iotdb/relational/it/schema/IoTDBTableIT.java | 6 +-
.../it/session/IoTDBTableModelSessionIT.java | 114 ++++++++++++
.../session/pool/IoTDBTableModelSessionPoolIT.java | 196 +++++++++++++++++++++
.../apache/iotdb/isession/pool/ISessionPool.java | 3 +
.../org/apache/iotdb/session/pool/SessionPool.java | 1 +
.../protocol/thrift/impl/ClientRPCServiceImpl.java | 6 +
.../config/executor/ClusterConfigTaskExecutor.java | 46 +++--
12 files changed, 590 insertions(+), 22 deletions(-)
diff --git a/example/session/src/main/java/org/apache/iotdb/TableModelSessionPoolExample.java b/example/session/src/main/java/org/apache/iotdb/TableModelSessionPoolExample.java
new file mode 100644
index 00000000000..78af9efdd6d
--- /dev/null
+++ b/example/session/src/main/java/org/apache/iotdb/TableModelSessionPoolExample.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb;
+
+import org.apache.iotdb.isession.IPooledSession;
+import org.apache.iotdb.isession.SessionDataSet;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.session.pool.SessionPool;
+
+public class TableModelSessionPoolExample {
+
+ private static final String LOCAL_HOST = "127.0.0.1";
+
+ public static void main(String[] args) {
+
+ // don't specify database in constructor
+ SessionPool sessionPool =
+ new SessionPool.Builder()
+ .host(LOCAL_HOST)
+ .port(6667)
+ .user("root")
+ .password("root")
+ .maxSize(1)
+ .sqlDialect("table")
+ .build();
+
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ session.executeNonQueryStatement("CREATE DATABASE test1");
+ session.executeNonQueryStatement("CREATE DATABASE test2");
+
+ session.executeNonQueryStatement("use test2");
+
+ // or use full qualified table name
+ session.executeNonQueryStatement(
+ "create table test1.table1(region_id STRING ID, plant_id STRING ID, device_id STRING ID, model STRING ATTRIBUTE, temperature FLOAT MEASUREMENT, humidity DOUBLE MEASUREMENT) with (TTL=3600000)");
+
+ session.executeNonQueryStatement(
+ "create table table2(region_id STRING ID, plant_id STRING ID, color STRING ATTRIBUTE, temperature FLOAT MEASUREMENT, speed DOUBLE MEASUREMENT) with (TTL=6600000)");
+
+ // show tables from current database
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ System.out.println(dataSet.getColumnNames());
+ System.out.println(dataSet.getColumnTypes());
+ while (dataSet.hasNext()) {
+ System.out.println(dataSet.next());
+ }
+ }
+
+ // show tables by specifying another database
+ // using SHOW tables FROM
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES FROM test1")) {
+ System.out.println(dataSet.getColumnNames());
+ System.out.println(dataSet.getColumnTypes());
+ while (dataSet.hasNext()) {
+ System.out.println(dataSet.next());
+ }
+ }
+
+ } catch (IoTDBConnectionException e) {
+ e.printStackTrace();
+ } catch (StatementExecutionException e) {
+ e.printStackTrace();
+ } finally {
+ sessionPool.close();
+ }
+
+ // specify database in constructor
+ sessionPool =
+ new SessionPool.Builder()
+ .host(LOCAL_HOST)
+ .port(6667)
+ .user("root")
+ .password("root")
+ .maxSize(1)
+ .sqlDialect("table")
+ .database("test1")
+ .build();
+
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ // show tables from current database
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ System.out.println(dataSet.getColumnNames());
+ System.out.println(dataSet.getColumnTypes());
+ while (dataSet.hasNext()) {
+ System.out.println(dataSet.next());
+ }
+ }
+
+ // change database to test2
+ session.executeNonQueryStatement("use test2");
+
+ // show tables by specifying another database
+ // using SHOW tables FROM
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ System.out.println(dataSet.getColumnNames());
+ System.out.println(dataSet.getColumnTypes());
+ while (dataSet.hasNext()) {
+ System.out.println(dataSet.next());
+ }
+ }
+
+ } catch (IoTDBConnectionException e) {
+ e.printStackTrace();
+ } catch (StatementExecutionException e) {
+ e.printStackTrace();
+ }
+
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ // show tables from default database test1
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ System.out.println(dataSet.getColumnNames());
+ System.out.println(dataSet.getColumnTypes());
+ while (dataSet.hasNext()) {
+ System.out.println(dataSet.next());
+ }
+ }
+
+ } catch (IoTDBConnectionException e) {
+ e.printStackTrace();
+ } catch (StatementExecutionException e) {
+ e.printStackTrace();
+ } finally {
+ sessionPool.close();
+ }
+ }
+}
diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
index 2fd68b5bbf6..b0e483d61bb 100644
--- a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
+++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java
@@ -429,6 +429,22 @@ public abstract class AbstractEnv implements BaseEnv {
return session;
}
+ @Override
+ public ISession getSessionConnectionWithDB(String sqlDialect, String database)
+ throws IoTDBConnectionException {
+ DataNodeWrapper dataNode =
+ this.dataNodeWrapperList.get(rand.nextInt(this.dataNodeWrapperList.size()));
+ Session session =
+ new Session.Builder()
+ .host(dataNode.getIp())
+ .port(dataNode.getPort())
+ .sqlDialect(sqlDialect)
+ .database(database)
+ .build();
+ session.open();
+ return session;
+ }
+
@Override
public ISession getSessionConnection(String userName, String password, String sqlDialect)
throws IoTDBConnectionException {
@@ -480,6 +496,21 @@ public abstract class AbstractEnv implements BaseEnv {
.build();
}
+ @Override
+ public ISessionPool getSessionPool(int maxSize, String sqlDialect, String database) {
+ DataNodeWrapper dataNode =
+ this.dataNodeWrapperList.get(rand.nextInt(this.dataNodeWrapperList.size()));
+ return new SessionPool.Builder()
+ .host(dataNode.getIp())
+ .port(dataNode.getPort())
+ .user(SessionConfig.DEFAULT_USER)
+ .password(SessionConfig.DEFAULT_PASSWORD)
+ .maxSize(maxSize)
+ .sqlDialect(sqlDialect)
+ .database(database)
+ .build();
+ }
+
protected NodeConnection getWriteConnection(
Constant.Version version, String username, String password, String sqlDialect)
throws SQLException {
diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java b/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
index 665d6248ad0..6c75c22ad96 100644
--- a/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
+++ b/integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java
@@ -216,6 +216,28 @@ public class RemoteServerEnv implements BaseEnv {
.build();
}
+ @Override
+ public ISessionPool getSessionPool(int maxSize, String sqlDialect, String database) {
+ return new SessionPool.Builder()
+ .host(SessionConfig.DEFAULT_HOST)
+ .port(SessionConfig.DEFAULT_PORT)
+ .user(SessionConfig.DEFAULT_USER)
+ .password(SessionConfig.DEFAULT_PASSWORD)
+ .maxSize(maxSize)
+ .fetchSize(SessionConfig.DEFAULT_FETCH_SIZE)
+ .waitToGetSessionTimeoutInMs(60_000)
+ .enableCompression(false)
+ .zoneId(null)
+ .enableRedirection(SessionConfig.DEFAULT_REDIRECTION_MODE)
+ .connectionTimeoutInMs(SessionConfig.DEFAULT_CONNECTION_TIMEOUT_MS)
+ .version(SessionConfig.DEFAULT_VERSION)
+ .thriftDefaultBufferSize(SessionConfig.DEFAULT_INITIAL_BUFFER_CAPACITY)
+ .thriftMaxFrameSize(SessionConfig.DEFAULT_MAX_FRAME_SIZE)
+ .sqlDialect(sqlDialect)
+ .database(database)
+ .build();
+ }
+
@Override
public ISession getSessionConnection(String sqlDialect) throws IoTDBConnectionException {
Session session =
@@ -228,6 +250,20 @@ public class RemoteServerEnv implements BaseEnv {
return session;
}
+ @Override
+ public ISession getSessionConnectionWithDB(String sqlDialect, String database)
+ throws IoTDBConnectionException {
+ Session session =
+ new Session.Builder()
+ .host(ip_addr)
+ .port(Integer.parseInt(port))
+ .sqlDialect(sqlDialect)
+ .database(database)
+ .build();
+ session.open();
+ return session;
+ }
+
@Override
public ISession getSessionConnection(String userName, String password, String sqlDialect)
throws IoTDBConnectionException {
diff --git a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
index 472df6c6f63..b5af08af1cf 100644
--- a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
+++ b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseEnv.java
@@ -174,12 +174,17 @@ public interface BaseEnv {
ISessionPool getSessionPool(int maxSize, String sqlDialect);
+ ISessionPool getSessionPool(int maxSize, String sqlDialect, String database);
+
default ISession getSessionConnection() throws IoTDBConnectionException {
return getSessionConnection(TREE_SQL_DIALECT);
}
ISession getSessionConnection(String sqlDialect) throws IoTDBConnectionException;
+ ISession getSessionConnectionWithDB(String sqlDialect, String database)
+ throws IoTDBConnectionException;
+
default ISession getSessionConnection(String userName, String password)
throws IoTDBConnectionException {
return getSessionConnection(userName, password, TREE_SQL_DIALECT);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
index 3260d4b27f6..56246f1d790 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
@@ -65,6 +65,17 @@ public class IoTDBDatabaseIT {
// create
statement.execute("create database test");
+ // create duplicated database without IF NOT EXISTS
+ try {
+ statement.execute("create database test");
+ fail("create database test shouldn't succeed because test already exists");
+ } catch (SQLException e) {
+ assertEquals("501: Database test already exists", e.getMessage());
+ }
+
+ // create duplicated database with IF NOT EXISTS
+ statement.execute("create database IF NOT EXISTS test");
+
String[] databaseNames = new String[] {"test"};
int[] schemaReplicaFactors = new int[] {1};
int[] dataReplicaFactors = new int[] {1};
@@ -105,15 +116,17 @@ public class IoTDBDatabaseIT {
assertFalse(resultSet.next());
}
- // drop nonexistent database
+ // drop nonexistent database without IF EXISTS
try {
statement.execute("drop database test");
- fail("drop database test shouldn't succeed because test1 doesn't exist");
+ fail("drop database test shouldn't succeed because test doesn't exist");
} catch (SQLException e) {
- // TODO error msg should be changed to 500: Database test1 doesn't exists
- assertEquals("508: Path [root.test] does not exist", e.getMessage());
+ assertEquals("500: Database test doesn't exist", e.getMessage());
}
+ // drop nonexistent database with IF EXISTS
+ statement.execute("drop database IF EXISTS test");
+
// create with strange name
try {
statement.execute("create database 1test");
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 8e74b7ced8a..72519a38c45 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
@@ -129,7 +129,7 @@ public class IoTDBTableIT {
}
while (resultSet.next()) {
assertEquals(tableNames[cnt], resultSet.getString(1));
- assertEquals(ttls[cnt], resultSet.getInt(2));
+ assertEquals(ttls[cnt], resultSet.getLong(2));
cnt++;
}
assertEquals(tableNames.length, cnt);
@@ -150,7 +150,7 @@ public class IoTDBTableIT {
}
while (resultSet.next()) {
assertEquals(tableNames[cnt], resultSet.getString(1));
- assertEquals(ttls[cnt], resultSet.getInt(2));
+ assertEquals(ttls[cnt], resultSet.getLong(2));
cnt++;
}
assertEquals(tableNames.length, cnt);
@@ -167,7 +167,7 @@ public class IoTDBTableIT {
}
while (resultSet.next()) {
assertEquals(tableNames[cnt], resultSet.getString(1));
- assertEquals(ttls[cnt], resultSet.getInt(2));
+ assertEquals(ttls[cnt], resultSet.getLong(2));
cnt++;
}
assertEquals(tableNames.length, cnt);
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBTableModelSessionIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBTableModelSessionIT.java
new file mode 100644
index 00000000000..24abb4c6b87
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBTableModelSessionIT.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.relational.it.session;
+
+import org.apache.iotdb.isession.ISession;
+import org.apache.iotdb.isession.SessionDataSet;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
+
+import org.apache.tsfile.read.common.RowRecord;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import static org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant.showTablesColumnHeaders;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBTableModelSessionIT {
+
+ @Before
+ public void setUp() throws Exception {
+ EnvFactory.getEnv().initClusterEnvironment();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ @Test
+ public void testUseDatabase() {
+ String[] table1Names = new String[] {"table1"};
+ long[] table1ttls = new long[] {3600000L};
+
+ String[] table2Names = new String[] {"table2"};
+ long[] table2ttls = new long[] {6600000L};
+
+ try (ISession session = EnvFactory.getEnv().getSessionConnectionWithDB("table", "test2")) {
+
+ session.executeNonQueryStatement("CREATE DATABASE test1");
+ session.executeNonQueryStatement("CREATE DATABASE test2");
+
+ // or use full qualified table name
+ session.executeNonQueryStatement(
+ "create table test1.table1(region_id STRING ID, plant_id STRING ID, device_id STRING ID, model STRING ATTRIBUTE, temperature FLOAT MEASUREMENT, humidity DOUBLE MEASUREMENT) with (TTL=3600000)");
+
+ session.executeNonQueryStatement(
+ "create table table2(region_id STRING ID, plant_id STRING ID, color STRING ATTRIBUTE, temperature FLOAT MEASUREMENT, speed DOUBLE MEASUREMENT) with (TTL=6600000)");
+
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table2Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table2ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table2Names.length, cnt);
+ }
+
+ session.executeNonQueryStatement("use test1");
+
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table1Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table1ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table1Names.length, cnt);
+ }
+
+ } catch (IoTDBConnectionException | StatementExecutionException e) {
+ fail(e.getMessage());
+ }
+ }
+}
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/pool/IoTDBTableModelSessionPoolIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/pool/IoTDBTableModelSessionPoolIT.java
new file mode 100644
index 00000000000..db87a401de9
--- /dev/null
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/pool/IoTDBTableModelSessionPoolIT.java
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.relational.it.session.pool;
+
+import org.apache.iotdb.isession.IPooledSession;
+import org.apache.iotdb.isession.SessionDataSet;
+import org.apache.iotdb.isession.pool.ISessionPool;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+import org.apache.iotdb.rpc.IoTDBConnectionException;
+import org.apache.iotdb.rpc.StatementExecutionException;
+
+import org.apache.tsfile.read.common.RowRecord;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import static org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant.showTablesColumnHeaders;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({LocalStandaloneIT.class, ClusterIT.class})
+public class IoTDBTableModelSessionPoolIT {
+
+ @Before
+ public void setUp() throws Exception {
+ EnvFactory.getEnv().initClusterEnvironment();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ EnvFactory.getEnv().cleanClusterEnvironment();
+ }
+
+ @Test
+ public void testUseDatabase() {
+
+ String[] table1Names = new String[] {"table1"};
+ long[] table1ttls = new long[] {3600000L};
+
+ String[] table2Names = new String[] {"table2"};
+ long[] table2ttls = new long[] {6600000L};
+
+ ISessionPool sessionPool = EnvFactory.getEnv().getSessionPool(1, "table");
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ session.executeNonQueryStatement("CREATE DATABASE test1");
+ session.executeNonQueryStatement("CREATE DATABASE test2");
+
+ session.executeNonQueryStatement("use test2");
+
+ // or use full qualified table name
+ session.executeNonQueryStatement(
+ "create table test1.table1(region_id STRING ID, plant_id STRING ID, device_id STRING ID, model STRING ATTRIBUTE, temperature FLOAT MEASUREMENT, humidity DOUBLE MEASUREMENT) with (TTL=3600000)");
+
+ session.executeNonQueryStatement(
+ "create table table2(region_id STRING ID, plant_id STRING ID, color STRING ATTRIBUTE, temperature FLOAT MEASUREMENT, speed DOUBLE MEASUREMENT) with (TTL=6600000)");
+
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table2Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table2ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table2Names.length, cnt);
+ }
+
+ } catch (IoTDBConnectionException | StatementExecutionException e) {
+ fail(e.getMessage());
+ }
+
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ // current session's database is still test2
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table2Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table2ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table2Names.length, cnt);
+ }
+
+ } catch (IoTDBConnectionException | StatementExecutionException e) {
+ fail(e.getMessage());
+ } finally {
+ sessionPool.close();
+ }
+
+ // specify database in constructor
+ sessionPool = EnvFactory.getEnv().getSessionPool(1, "table", "test1");
+
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ // current session's database is test1
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table1Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table1ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table1Names.length, cnt);
+ }
+
+ // change database to test2
+ session.executeNonQueryStatement("use test2");
+
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table2Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table2ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table2Names.length, cnt);
+ }
+
+ } catch (IoTDBConnectionException | StatementExecutionException e) {
+ fail(e.getMessage());
+ }
+
+ // after putting back, the session's database should be changed back to default test1
+ try (IPooledSession session = sessionPool.getPooledSession()) {
+
+ try (SessionDataSet dataSet = session.executeQueryStatement("SHOW TABLES")) {
+ int cnt = 0;
+ assertEquals(showTablesColumnHeaders.size(), dataSet.getColumnNames().size());
+ for (int i = 0; i < showTablesColumnHeaders.size(); i++) {
+ assertEquals(
+ showTablesColumnHeaders.get(i).getColumnName(), dataSet.getColumnNames().get(i));
+ }
+ while (dataSet.hasNext()) {
+ RowRecord rowRecord = dataSet.next();
+ assertEquals(table1Names[cnt], rowRecord.getFields().get(0).getStringValue());
+ assertEquals(table1ttls[cnt], rowRecord.getFields().get(1).getLongV());
+ cnt++;
+ }
+ assertEquals(table1Names.length, cnt);
+ }
+
+ } catch (IoTDBConnectionException | StatementExecutionException e) {
+ fail(e.getMessage());
+ } finally {
+ sessionPool.close();
+ }
+ }
+}
diff --git a/iotdb-client/isession/src/main/java/org/apache/iotdb/isession/pool/ISessionPool.java b/iotdb-client/isession/src/main/java/org/apache/iotdb/isession/pool/ISessionPool.java
index eeb6509e89d..768a4ceb136 100644
--- a/iotdb-client/isession/src/main/java/org/apache/iotdb/isession/pool/ISessionPool.java
+++ b/iotdb-client/isession/src/main/java/org/apache/iotdb/isession/pool/ISessionPool.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.isession.pool;
import org.apache.iotdb.common.rpc.thrift.TAggregationType;
+import org.apache.iotdb.isession.IPooledSession;
import org.apache.iotdb.isession.template.Template;
import org.apache.iotdb.isession.util.SystemStatus;
import org.apache.iotdb.isession.util.Version;
@@ -558,6 +559,8 @@ public interface ISessionPool {
long getQueryTimeout();
+ IPooledSession getPooledSession() throws IoTDBConnectionException;
+
/**
* @deprecated
*/
diff --git a/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java b/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java
index aae9db1377f..da9256dd683 100644
--- a/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java
+++ b/iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java
@@ -713,6 +713,7 @@ public class SessionPool implements ISessionPool {
return session;
}
+ @Override
public IPooledSession getPooledSession() throws IoTDBConnectionException {
return new SessionWrapper((Session) getSession(), this);
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index c5f485b680d..524e918a141 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -93,6 +93,7 @@ import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.InputLocation
import org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.SeriesScanOptions;
import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.ParsingException;
import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser;
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
@@ -394,6 +395,11 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler {
}
return resp;
}
+ } catch (ParsingException e) {
+ finished = true;
+ t = e;
+ return RpcUtils.getTSExecuteStatementResp(
+ RpcUtils.getStatus(TSStatusCode.SQL_PARSE_ERROR, e.getMessage()));
} catch (Exception e) {
finished = true;
t = e;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index aea0ab14e5e..1cc847a41d2 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -2828,14 +2828,26 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
try (ConfigNodeClient client =
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
TSStatus tsStatus = client.deleteDatabases(req);
- if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
+ if (TSStatusCode.SUCCESS_STATUS.getStatusCode() == tsStatus.getCode()) {
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ } else if (TSStatusCode.PATH_NOT_EXIST.getStatusCode() == tsStatus.getCode()) {
+ if (dropDB.isExists()) {
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ } else {
+ LOGGER.info(
+ "Failed to DROP DATABASE {}, because it doesn't exist",
+ dropDB.getDbName().getValue());
+ future.setException(
+ new IoTDBException(
+ String.format("Database %s doesn't exist", dropDB.getDbName().getValue()),
+ TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()));
+ }
+ } else {
LOGGER.warn(
"Failed to execute delete database {} in config node, status is {}.",
dropDB.getDbName().getValue(),
tsStatus);
future.setException(new IoTDBException(tsStatus.message, tsStatus.getCode()));
- } else {
- future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
}
} catch (ClientManagerException | TException e) {
future.setException(e);
@@ -2853,22 +2865,26 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
// Send request to some API server
TSStatus tsStatus = configNodeClient.setDatabase(databaseSchema);
- // Get response or throw exception
- if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
- // If database already exists when loading, we do not throw exceptions to avoid printing too
- // many logs
- if (TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode() == tsStatus.getCode()
- && createDB.isSetIfNotExists()) {
+
+ if (TSStatusCode.SUCCESS_STATUS.getStatusCode() == tsStatus.getCode()) {
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ } else if (TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode() == tsStatus.getCode()) {
+ if (createDB.isSetIfNotExists()) {
future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
} else {
- LOGGER.warn(
- "Failed to execute create database {} in config node, status is {}.",
- createDB.getDbName(),
- tsStatus);
- future.setException(new IoTDBException(tsStatus.message, tsStatus.code));
+ LOGGER.info(
+ "Failed to CREATE DATABASE {}, because it already exists", createDB.getDbName());
+ future.setException(
+ new IoTDBException(
+ String.format("Database %s already exists", createDB.getDbName()),
+ TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode()));
}
} else {
- future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ LOGGER.warn(
+ "Failed to execute create database {} in config node, status is {}.",
+ createDB.getDbName(),
+ tsStatus);
+ future.setException(new IoTDBException(tsStatus.message, tsStatus.code));
}
} catch (ClientManagerException | TException e) {
future.setException(e);
(iotdb) 02/03: Merge remote-tracking branch 'origin/ty/TableModelGrammar' into ty/useXX
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch ty/useXX
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 0e56c7a094d1d3c93eeb4d4f7100138b9fd49dd6
Merge: 357c00b1e23 180e8fb422b
Author: JackieTien97 <ja...@gmail.com>
AuthorDate: Tue Jul 9 09:27:40 2024 +0800
Merge remote-tracking branch 'origin/ty/TableModelGrammar' into ty/useXX
.../it/dual/IoTDBSubscriptionConsumerGroupIT.java | 48 +++---
.../iotdb/confignode/manager/ProcedureManager.java | 183 ++++++++++++++++-----
.../impl/schema/DeleteDatabaseProcedure.java | 4 +
3 files changed, 173 insertions(+), 62 deletions(-)