This is an automated email from the ASF dual-hosted git repository. rong pushed a commit to branch select-into in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 7987fa536a660124474240def356fd8de97a4a10 Author: Steve Yurong Su <[email protected]> AuthorDate: Wed Jul 21 17:18:27 2021 +0800 add tests --- .../db/qp/logical/crud/SelectIntoOperator.java | 4 - .../iotdb/db/integration/IoTDBSelectIntoIT.java | 181 +++++++++++++++++++-- 2 files changed, 169 insertions(+), 16 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java index 7349a17..1303145 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java @@ -70,8 +70,4 @@ public class SelectIntoOperator extends Operator { public void setIntoPaths(List<PartialPath> intoPaths) { this.intoPaths = intoPaths; } - - public List<PartialPath> getIntoPaths() { - return intoPaths; - } } diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java index 51d9661..5ef1d23 100644 --- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java +++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java @@ -40,12 +40,12 @@ import java.sql.Statement; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +// TODO: check null values public class IoTDBSelectIntoIT { - private static final double E = 0.0001; - private static final String[] INSERTION_SQLS = { "insert into root.sg.d1(time, s2, s3, s4, s5, s6) values (0, 0, 0, 0, true, '0')", "insert into root.sg.d1(time, s1, s3, s4, s5, s6) values (1, 1, 1, 1, false, '1')", @@ -64,6 +64,7 @@ public class IoTDBSelectIntoIT { private static void createTimeSeries() throws MetadataException { IoTDB.metaManager.setStorageGroup(new PartialPath("root.sg")); + IoTDB.metaManager.createTimeseries( new PartialPath("root.sg.d1.s1"), TSDataType.INT32, @@ -100,6 +101,20 @@ public class IoTDBSelectIntoIT { TSEncoding.PLAIN, CompressionType.UNCOMPRESSED, null); + + IoTDB.metaManager.createTimeseries( + new PartialPath("root.sg.d1.empty"), + TSDataType.TEXT, + TSEncoding.PLAIN, + CompressionType.UNCOMPRESSED, + null); + + IoTDB.metaManager.createTimeseries( + new PartialPath("root.sg.d2.s1"), + TSDataType.INT32, + TSEncoding.PLAIN, + CompressionType.UNCOMPRESSED, + null); } private static void generateData() { @@ -110,6 +125,8 @@ public class IoTDBSelectIntoIT { for (String dataGenerationSql : INSERTION_SQLS) { statement.execute(dataGenerationSql); } + + statement.execute("insert into root.sg.d2(time, s1) values (0, 0)"); } catch (SQLException throwable) { fail(throwable.getMessage()); } @@ -135,7 +152,7 @@ public class IoTDBSelectIntoIT { assertEquals(1 + 6, columnCount); for (int i = 0; i < INSERTION_SQLS.length; ++i) { - resultSet.next(); + assertTrue(resultSet.next()); StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < 6 + 1; ++j) { stringBuilder.append(resultSet.getString(j + 1)).append(','); @@ -155,16 +172,17 @@ public class IoTDBSelectIntoIT { DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") .createStatement()) { statement.execute( - "select s1, s2, s3, s4, s5, s6 into s1.${2}, s2.${2}, s3.${2}, s4.${2}, s5.${2}, s6.${2} from root.sg.d1"); + "select s1, s2, s3, s4, s5, s6 into pre_${2}_suf.s1, pre_${2}_suf.s2, pre_${2}_suf.s3, pre_${2}_suf.s4, pre_${2}_suf.s5, pre_${2}_suf.s6 from root.sg.d1"); ResultSet resultSet = - statement.executeQuery("select s1.d1, s2.d1, s3.d1, s4.d1, s5.d1, s6.d1 from root.sg.d1"); + statement.executeQuery( + "select pre_d1_suf.s1, pre_d1_suf.s2, pre_d1_suf.s3, pre_d1_suf.s4, pre_d1_suf.s5, pre_d1_suf.s6 from root.sg.d1"); int columnCount = resultSet.getMetaData().getColumnCount(); assertEquals(1 + 6, columnCount); for (int i = 0; i < INSERTION_SQLS.length; ++i) { - resultSet.next(); + assertTrue(resultSet.next()); StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < 6 + 1; ++j) { stringBuilder.append(resultSet.getString(j + 1)).append(','); @@ -178,10 +196,149 @@ public class IoTDBSelectIntoIT { fail(throwable.getMessage()); } } -} -// usage limit: select columns, into columns, from columns -// grammar of into clause (wrong cases and right cases) -// supported query -// cluster mode test -// cq uses select-into plan + @Test + public void selectFromEmptySourcePath() { + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select empty into target from root.sg.d1"); + + ResultSet resultSet = statement.executeQuery("select target from root.sg.d1"); + + assertEquals(1, resultSet.getMetaData().getColumnCount()); + assertFalse(resultSet.next()); + } catch (SQLException throwable) { + throwable.printStackTrace(); + fail(throwable.getMessage()); + } + } + + @Test + public void selectIntoFullTargetPath() { + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1 into root.${2}.${1}.s1 from root.sg.d1 where time>0"); + + ResultSet resultSet = statement.executeQuery("select sg.d1.s1, d1.sg.s1 from root"); + + int columnCount = resultSet.getMetaData().getColumnCount(); + assertEquals(1 + 2, columnCount); + + for (int i = 0; i < INSERTION_SQLS.length - 1; ++i) { + assertTrue(resultSet.next()); + assertEquals(resultSet.getString(1), String.valueOf(i + 1)); + assertEquals(resultSet.getString(2), resultSet.getString(3)); + } + + assertFalse(resultSet.next()); + } catch (SQLException throwable) { + fail(throwable.getMessage()); + } + } + + @Test + public void testDifferentNumbersOfSourcePathsAndTargetPaths() { + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1, s2 into target from root.sg.d1"); + fail(); + } catch (SQLException throwable) { + assertTrue( + throwable + .getMessage() + .contains( + "the number of source paths and the number of target paths should be the same")); + } + + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1 into target from root.sg.*"); + fail(); + } catch (SQLException throwable) { + assertTrue( + throwable + .getMessage() + .contains( + "the number of source paths and the number of target paths should be the same")); + } + + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select * into target from root.sg.d1"); + fail(); + } catch (SQLException throwable) { + assertTrue( + throwable + .getMessage() + .contains( + "the number of source paths and the number of target paths should be the same")); + } + } + + @Test + public void testMultiPrefixPathsInFromClause() { + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1 into target from root.sg.d1, root.sg.d2"); + fail(); + } catch (SQLException throwable) { + assertTrue( + throwable + .getMessage() + .contains("the number of prefix paths in the from clause should be 1")); + } + } + + @Test + public void testLeveledPathNodePatternLimit() { + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1 into root.${100}.s1 from root.sg.d1"); + ResultSet resultSet = statement.executeQuery("select sg.d1.s1, d1.sg.s1 from root"); + assertEquals(1, resultSet.getMetaData().getColumnCount()); + assertFalse(resultSet.next()); + fail(); + } catch (SQLException throwable) { + assertTrue( + throwable + .getMessage() + .contains( + "the x of ${x} should be greater than 0 and equal to or less than <level> or the length of queried path prefix.")); + } + + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1 into root.${0}.s1 from root.sg.d1"); + ResultSet resultSet = statement.executeQuery("select sg.d1.s1, d1.sg.s1 from root"); + assertEquals(1, resultSet.getMetaData().getColumnCount()); + assertFalse(resultSet.next()); + fail(); + } catch (SQLException throwable) { + assertTrue( + throwable + .getMessage() + .contains( + "the x of ${x} should be greater than 0 and equal to or less than <level> or the length of queried path prefix.")); + } + + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute("select s1 into root.${wrong}.s1 from root.sg.d1"); + ResultSet resultSet = statement.executeQuery("select sg.d1.s1, d1.sg.s1 from root"); + assertEquals(1, resultSet.getMetaData().getColumnCount()); + assertFalse(resultSet.next()); + fail(); + } catch (SQLException throwable) { + assertTrue(throwable.getMessage().contains("the x of ${x} should be an integer.")); + } + } +}
