This is an automated email from the ASF dual-hosted git repository. rongr pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new 6eeb9fb594 [multistage] 10736: Fix for self join table names extraction in multistage (#10739) 6eeb9fb594 is described below commit 6eeb9fb5946c3e08eb3f48c72205092517539e60 Author: Abhishek Sharma <abhishek.sha...@spothero.com> AuthorDate: Wed May 10 01:07:34 2023 -0400 [multistage] 10736: Fix for self join table names extraction in multistage (#10739) * 10736: Fix for self join table names extraction in multistage * 10736: Added comment in unit test case. * 10736: Added the test case as per PR comment. * 10736: Minor change for re-triggering PR build pipelines. --- .../apache/pinot/sql/parsers/CalciteSqlParser.java | 6 +++++- .../pinot/sql/parsers/CalciteSqlCompilerTest.java | 25 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java b/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java index 3a19108041..c39878e840 100644 --- a/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java +++ b/pinot-common/src/main/java/org/apache/pinot/sql/parsers/CalciteSqlParser.java @@ -172,7 +172,11 @@ public class CalciteSqlParser { } else if (sqlNode instanceof SqlBasicCall) { if (((SqlBasicCall) sqlNode).getOperator() instanceof SqlAsOperator) { SqlNode firstOperand = ((SqlBasicCall) sqlNode).getOperandList().get(0); - tableNames.addAll(((SqlIdentifier) firstOperand).names); + if (firstOperand instanceof SqlSelect) { + tableNames.addAll(extractTableNamesFromNode(firstOperand)); + } else { + tableNames.addAll(((SqlIdentifier) firstOperand).names); + } } else { for (SqlNode node : ((SqlBasicCall) sqlNode).getOperandList()) { tableNames.addAll(extractTableNamesFromNode(node)); diff --git a/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlCompilerTest.java b/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlCompilerTest.java index f45f611d50..fd6c3b6ac3 100644 --- a/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlCompilerTest.java +++ b/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlCompilerTest.java @@ -3138,6 +3138,14 @@ public class CalciteSqlCompilerTest { Assert.assertEquals(tableNames.get(1), "tbl2"); Assert.assertEquals(tableNames.get(2), "tbl3"); Assert.assertEquals(tableNames.get(3), "tbl4"); + + // test for self join queries + query = "SELECT tbl1.a FROM tbl1 JOIN(SELECT a FROM tbl1) as self ON tbl1.a=self.a "; + sqlNodeAndOptions = RequestUtils.parseQuery(query); + tableNames = CalciteSqlParser.extractTableNamesFromNode(sqlNodeAndOptions.getSqlNode()); + Assert.assertEquals(tableNames.size(), 2); + Assert.assertEquals(tableNames.get(0), "tbl1"); + Assert.assertEquals(tableNames.get(1), "tbl1"); } @Test @@ -3223,5 +3231,22 @@ public class CalciteSqlCompilerTest { Assert.assertEquals(rightSubquery, CalciteSqlParser.compileToPinotQuery("SELECT key, COUNT(*) AS b FROM T3 JOIN T4 GROUP BY key")); Assert.assertEquals(join.getCondition(), CalciteSqlParser.compileToExpression("T1.key = T2.key")); + + // test for self join queries. + query = "SELECT T1.a FROM T1 JOIN(SELECT key FROM T1) as self ON T1.key=self.key"; + pinotQuery = CalciteSqlParser.compileToPinotQuery(query); + dataSource = pinotQuery.getDataSource(); + Assert.assertNull(dataSource.getTableName()); + Assert.assertNull(dataSource.getSubquery()); + Assert.assertNotNull(dataSource.getJoin()); + join = dataSource.getJoin(); + Assert.assertEquals(join.getType(), JoinType.INNER); + Assert.assertEquals(join.getLeft().getTableName(), "T1"); + right = join.getRight(); + Assert.assertEquals(right.getTableName(), "self"); + rightSubquery = right.getSubquery(); + Assert.assertEquals(rightSubquery, + CalciteSqlParser.compileToPinotQuery("SELECT key FROM T1")); + Assert.assertEquals(join.getCondition(), CalciteSqlParser.compileToExpression("T1.key = self.key")); } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org