diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java index b60ca014faba..4560a543f67f 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java @@ -168,7 +168,7 @@ public void testMockQuery() throws OperatorNotFoundException { metadata.getOperatorReturnType(eq(OperatorType.ADD), eq(Arrays.asList(INT32, INT32)))) .thenReturn(DOUBLE); - Analysis actualAnalysis = analyzeSQL(sql, metadata); + Analysis actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); System.out.println(actualAnalysis.getTypes()); } @@ -177,7 +177,7 @@ public void testMockQuery() throws OperatorNotFoundException { public void singleTableNoFilterTest() { // wildcard sql = "SELECT * FROM testdb.table1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); @@ -217,7 +217,7 @@ public void singleTableNoFilterTest() { public void singleTableWithFilterTest1() { // only global time filter sql = "SELECT * FROM table1 where time > 1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -268,7 +268,7 @@ public void singleTableWithFilterTest1() { public void singleTableWithFilterTest2() { // measurement value filter, which can be pushed down to TableScanNode sql = "SELECT tag1, attr1, s2 FROM table1 where s1 > 1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -331,7 +331,7 @@ public void singleTableWithFilterTest3() { // timePredicate of TableScanNode sql = "SELECT tag1, attr1, s2 FROM table1 where s1 > 1 and s2>2 and tag1='A' and time > 1 and time < 10"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -361,7 +361,7 @@ public void singleTableWithFilterTest4() { // transfer to : ((("time" > 1) OR ("s1" > 1)) AND (("time" > 1) OR ("s2" > 2)) AND (("time" > // 1) OR ("time" < 10))) sql = "SELECT tag1, attr1, s2 FROM table1 where time > 1 or s1 > 1 and s2 > 2 and time < 10"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -390,7 +390,7 @@ public void singleTableWithFilterTest4() { public void singleTableWithFilterTest5() { // measurement value filter with time filter sql = "SELECT tag1, attr1, s2 FROM table1 where time > 1 or s1 > 1 or time < 10 or s2 > 2"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -432,7 +432,7 @@ public void singleTableWithFilterTest5() { public void singleTableWithFilterTest6() { // value filter which can not be pushed down sql = "SELECT tag1, attr1, s2 FROM table1 where diff(s1) > 1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); @@ -480,7 +480,7 @@ public void singleTableWithFilterTest6() { distributedQueryPlan.getFragments().get(1).getPlanNodeTree().getChildren().get(0); sql = "SELECT tag1, attr1, s2 FROM table1 where diff(s1) + 1 > 1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); @@ -505,14 +505,14 @@ public void singleTableWithFilterTest00() { // TODO(beyyes) fix the CNFs parse error sql = "SELECT tag1, attr1, s2 FROM table1 where (time > 1 and s1 > 1 or s2 < 7) or (time < 10 and s1 > 4)"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); } @Test public void singleTableProjectTest() { // 1. project without filter sql = "SELECT time, tag1, attr1, s1 FROM table1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -527,7 +527,7 @@ public void singleTableProjectTest() { // 2. project with filter sql = "SELECT tag1, attr1, s1 FROM table1 WHERE tag2='A' and s2=8"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); assertNotNull(actualAnalysis); assertEquals(1, actualAnalysis.getTables().size()); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); @@ -550,7 +550,7 @@ public void singleTableProjectTest() { // 3. project with filter and function sql = "SELECT s1+s3, CAST(s2 AS DOUBLE) FROM table1 WHERE REPLACE(tag1, 'low', '!')='!' AND attr2='B'"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) @@ -571,7 +571,7 @@ public void singleTableProjectTest() { // 4. project with not all attributes, to test the rightness of PruneUnUsedColumns sql = "SELECT tag2, attr2, s2 FROM table1"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) @@ -589,7 +589,7 @@ public void expressionTest() { // 1. is null / is not null sql = "SELECT * FROM table1 WHERE tag1 is not null and s1 is null"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -608,7 +608,7 @@ public void expressionTest() { // 2. like sql = "SELECT * FROM table1 WHERE tag1 like '%m'"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -625,7 +625,7 @@ public void expressionTest() { sql = "SELECT *, s1/2, s2+1, s2*3, s1+s2, s2%1 FROM table1 WHERE tag1 in ('A', 'B') and tag2 not in ('A', 'C')"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -642,7 +642,7 @@ public void expressionTest() { // 4. not sql = "SELECT * FROM table1 WHERE tag1 not like '%m'"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -651,7 +651,7 @@ public void expressionTest() { // 5. String literal comparisons sql = "SELECT * FROM table1 WHERE tag1 <= 's1'"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -666,7 +666,7 @@ public void expressionTest() { // 6. String column comparisons sql = "SELECT * FROM table1 WHERE tag1 != attr1"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -684,7 +684,7 @@ public void functionTest() { // 1. cast sql = "SELECT CAST(s2 AS DOUBLE) FROM table1 WHERE CAST(s1 AS DOUBLE) > 1.0"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); logicalQueryPlan = logicalPlanner.plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -693,7 +693,7 @@ public void functionTest() { sql = "SELECT SUBSTRING(tag1, 2), SUBSTRING(tag2, s1) FROM table1 WHERE SUBSTRING(tag2, 1) = 'A'"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); logicalQueryPlan = logicalPlanner.plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -701,7 +701,7 @@ public void functionTest() { // 3. round sql = "SELECT ROUND(s1, 1) FROM table1 WHERE ROUND(s2, 2) > 1.0"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); logicalQueryPlan = logicalPlanner.plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -709,7 +709,7 @@ public void functionTest() { // 4. replace sql = "SELECT REPLACE(tag1, 'A', 'B') FROM table1 WHERE REPLACE(attr1, 'C', 'D') = 'D'"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); logicalQueryPlan = logicalPlanner.plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -720,7 +720,7 @@ public void diffTest() { // 1. only diff sql = "SELECT DIFF(s1) FROM table1 WHERE DIFF(s2) > 0"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); logicalQueryPlan = logicalPlanner.plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -763,7 +763,7 @@ public void diffTest() { // 2. diff with time filter, tag filter and measurement filter sql = "SELECT s1 FROM table1 WHERE DIFF(s2) > 0 and time > 5 and tag1 = 'A' and s1 = 1"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalPlanner = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP); logicalQueryPlan = logicalPlanner.plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -781,7 +781,7 @@ public void predicatePushDownTest() { "SELECT *, s1/2, s2+1 FROM table1 WHERE tag1 in ('A', 'B') and tag2 = 'C' and tag3 is not null and attr1 like '_'" + "and s2 iS NUll and S1 = 6 and s3 < 8.0 and tAG1 LIKE '%m'"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, WarningCollector.NOOP) .plan(actualAnalysis); @@ -807,7 +807,7 @@ public void predicatePushDownTest() { public void limitOffsetTest() { sql = "SELECT tag1, attr1, s1 FROM table1 offset 3 limit 5"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, warningCollector).plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -821,7 +821,7 @@ public void limitOffsetTest() { "SELECT *, s1/2, s2+1 FROM table1 WHERE tag1 in ('A', 'B') and tag2 = 'C' " + "and s2 iS NUll and S1 = 6 and s3 < 8.0 and tAG1 LIKE '%m' offset 3 limit 5"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, warningCollector).plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -837,7 +837,7 @@ public void limitOffsetTest() { public void predicateCannotNormalizedTest() { sql = "SELECT * FROM table1 where (time > 1 and s1 > 1 or s2 < 7) or (time < 10 and s1 > 4)"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, warningCollector).plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -854,7 +854,7 @@ public void predicateCannotNormalizedTest() { public void duplicateProjectionsTest() { sql = "SELECT Time,time,s1+1,S1+1,tag1,TAG1 FROM table1"; context = new MPPQueryContext(sql, queryId, sessionInfo, null, null); - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); logicalQueryPlan = new LogicalPlanner(context, metadata, sessionInfo, warningCollector).plan(actualAnalysis); rootNode = logicalQueryPlan.getRootNode(); @@ -954,6 +954,7 @@ public void analyzeInsertTablet() { analyzeStatement( insertTabletStatement.toRelationalStatement(context), mockMetadata, + context, new SqlParser(), sessionInfo); assertEquals(1, actualAnalysis.getDataPartition().getDataPartitionMap().size()); @@ -999,6 +1000,7 @@ public void analyzeInsertRow() { analyzeStatement( insertStatement.toRelationalStatement(context), mockMetadata, + context, new SqlParser(), sessionInfo); assertEquals(1, actualAnalysis.getDataPartition().getDataPartitionMap().size()); @@ -1031,30 +1033,35 @@ public void analyzeInsertRow() { assertEquals(1, distributedQueryPlan.getInstances().size()); } - public static Analysis analyzeSQL(String sql, Metadata metadata) { + public static Analysis analyzeSQL(String sql, Metadata metadata, final MPPQueryContext context) { SqlParser sqlParser = new SqlParser(); Statement statement = sqlParser.createStatement(sql, ZoneId.systemDefault()); SessionInfo session = new SessionInfo( 0, "test", ZoneId.systemDefault(), "testdb", IClientSession.SqlDialect.TABLE); - return analyzeStatement(statement, metadata, sqlParser, session); + return analyzeStatement(statement, metadata, context, sqlParser, session); } public static Analysis analyzeStatement( - Statement statement, Metadata metadata, SqlParser sqlParser, SessionInfo session) { + final Statement statement, + final Metadata metadata, + final MPPQueryContext context, + final SqlParser sqlParser, + final SessionInfo session) { try { - StatementAnalyzerFactory statementAnalyzerFactory = + final StatementAnalyzerFactory statementAnalyzerFactory = new StatementAnalyzerFactory(metadata, sqlParser, nopAccessControl); Analyzer analyzer = new Analyzer( + context, session, statementAnalyzerFactory, Collections.emptyList(), Collections.emptyMap(), NOOP); return analyzer.analyze(statement); - } catch (Exception e) { + } catch (final Exception e) { e.printStackTrace(); fail(statement + ", " + e.getMessage()); } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java index 170cff354d0e..254fd5f0912f 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.iotdb.db.queryengine.plan.relational.planner; import org.apache.iotdb.commons.conf.IoTDBConstant; @@ -113,17 +114,24 @@ public static Analysis analyze(String sql, Metadata metadata) { SessionInfo session = new SessionInfo( 0, "test", ZoneId.systemDefault(), "testdb", IClientSession.SqlDialect.TABLE); - return analyzeStatement(statement, metadata, sqlParser, session); + final MPPQueryContext context = + new MPPQueryContext(sql, new QueryId("test_query"), session, null, null); + return analyzeStatement(statement, metadata, context, sqlParser, session); } public static Analysis analyzeStatement( - Statement statement, Metadata metadata, SqlParser sqlParser, SessionInfo session) { + Statement statement, + Metadata metadata, + MPPQueryContext context, + SqlParser sqlParser, + SessionInfo session) { try { StatementAnalyzerFactory statementAnalyzerFactory = new StatementAnalyzerFactory(metadata, sqlParser, new NopAccessControl()); Analyzer analyzer = new Analyzer( + context, session, statementAnalyzerFactory, Collections.emptyList(), diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java index ad68875c1723..4820b14eadcf 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PredicateUtilsTest.java @@ -19,6 +19,11 @@ package org.apache.iotdb.db.queryengine.plan.relational.planner; +import org.apache.iotdb.commons.conf.IoTDBConstant; +import org.apache.iotdb.db.protocol.session.IClientSession; +import org.apache.iotdb.db.queryengine.common.MPPQueryContext; +import org.apache.iotdb.db.queryengine.common.QueryId; +import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.Analysis; import org.apache.iotdb.db.queryengine.plan.relational.analyzer.TestMatadata; import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; @@ -27,6 +32,8 @@ import org.apache.tsfile.utils.Pair; import org.junit.Test; +import java.time.ZoneId; + import static org.apache.iotdb.db.queryengine.plan.relational.analyzer.AnalyzerTest.analyzeSQL; import static org.apache.iotdb.db.queryengine.plan.relational.planner.PredicateUtils.extractGlobalTimePredicate; @@ -34,16 +41,29 @@ public class PredicateUtilsTest { @Test public void extractGlobalTimePredicateTest() { String sql = "SELECT tag1 FROM table1 where time>1 and s1>1"; - Metadata metadata = new TestMatadata(); + final Metadata metadata = new TestMatadata(); + final MPPQueryContext context = + new MPPQueryContext( + sql, + new QueryId("test_query"), + new SessionInfo( + 1L, + "iotdb-user", + ZoneId.systemDefault(), + IoTDBConstant.ClientVersion.V_1_0, + "db", + IClientSession.SqlDialect.TABLE), + null, + null); - Analysis actualAnalysis = analyzeSQL(sql, metadata); + Analysis actualAnalysis = analyzeSQL(sql, metadata, context); Pair ret = extractGlobalTimePredicate( actualAnalysis.getWhereMap().values().iterator().next(), true, true); System.out.println(ret.getLeft()); sql = "SELECT tag1 FROM table1 where time>1 and s1>1 or tag1='A'"; - actualAnalysis = analyzeSQL(sql, metadata); + actualAnalysis = analyzeSQL(sql, metadata, context); ret = extractGlobalTimePredicate( actualAnalysis.getWhereMap().values().iterator().next(), true, true);