From 6f5a8fc883e1d576117fdb92f09103067672aaca Mon Sep 17 00:00:00 2001 From: Rong Rong Date: Thu, 16 Feb 2023 10:26:01 -0800 Subject: [PATCH] [hotfix] use legacy case-when format before releasing 0.13 (#10291) --- .../apache/pinot/sql/parsers/CalciteSqlParser.java | 7 ++++--- .../pinot/sql/parsers/CalciteSqlCompilerTest.java | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) 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 c5755a4c874..b2738684206 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 @@ -713,15 +713,16 @@ private static Expression toExpression(SqlNode node) { SqlNode elseOperand = caseSqlNode.getElseOperand(); Expression caseFuncExpr = RequestUtils.getFunctionExpression("case"); Preconditions.checkState(whenOperands.size() == thenOperands.size()); - for (int i = 0; i < whenOperands.size(); i++) { - SqlNode whenSqlNode = whenOperands.get(i); + // TODO: convert this to new format once 0.13 is released + for (SqlNode whenSqlNode : whenOperands.getList()) { Expression whenExpression = toExpression(whenSqlNode); if (isAggregateExpression(whenExpression)) { throw new SqlCompilationException( "Aggregation functions inside WHEN Clause is not supported - " + whenSqlNode); } caseFuncExpr.getFunctionCall().addToOperands(whenExpression); - SqlNode thenSqlNode = thenOperands.get(i); + } + for (SqlNode thenSqlNode : thenOperands.getList()) { Expression thenExpression = toExpression(thenSqlNode); if (isAggregateExpression(thenExpression)) { throw new SqlCompilationException( 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 e74a1d7c2d3..e4fea65f73b 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 @@ -93,11 +93,11 @@ public void testCaseWhenStatements() { Assert.assertEquals(greatThanFunc.getOperator(), FilterKind.GREATER_THAN.name()); Assert.assertEquals(greatThanFunc.getOperands().get(0).getIdentifier().getName(), "Quantity"); Assert.assertEquals(greatThanFunc.getOperands().get(1).getLiteral().getFieldValue(), 30L); - Assert.assertEquals(caseFunc.getOperands().get(1).getLiteral().getFieldValue(), "The quantity is greater than 30"); - Function equalsFunc = caseFunc.getOperands().get(2).getFunctionCall(); + Function equalsFunc = caseFunc.getOperands().get(1).getFunctionCall(); Assert.assertEquals(equalsFunc.getOperator(), FilterKind.EQUALS.name()); Assert.assertEquals(equalsFunc.getOperands().get(0).getIdentifier().getName(), "Quantity"); Assert.assertEquals(equalsFunc.getOperands().get(1).getLiteral().getFieldValue(), 30L); + Assert.assertEquals(caseFunc.getOperands().get(2).getLiteral().getFieldValue(), "The quantity is greater than 30"); Assert.assertEquals(caseFunc.getOperands().get(3).getLiteral().getFieldValue(), "The quantity is 30"); Assert.assertEquals(caseFunc.getOperands().get(4).getLiteral().getFieldValue(), "The quantity is under 30"); @@ -124,16 +124,16 @@ public void testCaseWhenStatements() { Assert.assertEquals(greatThanFunc.getOperator(), FilterKind.GREATER_THAN.name()); Assert.assertEquals(greatThanFunc.getOperands().get(0).getIdentifier().getName(), "Quantity"); Assert.assertEquals(greatThanFunc.getOperands().get(1).getLiteral().getFieldValue(), 30L); - Assert.assertEquals(caseFunc.getOperands().get(1).getLiteral().getFieldValue(), 3L); - greatThanFunc = caseFunc.getOperands().get(2).getFunctionCall(); + greatThanFunc = caseFunc.getOperands().get(1).getFunctionCall(); Assert.assertEquals(greatThanFunc.getOperator(), FilterKind.GREATER_THAN.name()); Assert.assertEquals(greatThanFunc.getOperands().get(0).getIdentifier().getName(), "Quantity"); Assert.assertEquals(greatThanFunc.getOperands().get(1).getLiteral().getFieldValue(), 20L); - Assert.assertEquals(caseFunc.getOperands().get(3).getLiteral().getFieldValue(), 2L); - greatThanFunc = caseFunc.getOperands().get(4).getFunctionCall(); + greatThanFunc = caseFunc.getOperands().get(2).getFunctionCall(); Assert.assertEquals(greatThanFunc.getOperator(), FilterKind.GREATER_THAN.name()); Assert.assertEquals(greatThanFunc.getOperands().get(0).getIdentifier().getName(), "Quantity"); Assert.assertEquals(greatThanFunc.getOperands().get(1).getLiteral().getFieldValue(), 10L); + Assert.assertEquals(caseFunc.getOperands().get(3).getLiteral().getFieldValue(), 3L); + Assert.assertEquals(caseFunc.getOperands().get(4).getLiteral().getFieldValue(), 2L); Assert.assertEquals(caseFunc.getOperands().get(5).getLiteral().getFieldValue(), 1L); Assert.assertEquals(caseFunc.getOperands().get(6).getLiteral().getFieldValue(), 0L); }