This is an automated email from the ASF dual-hosted git repository.

rubenql pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 87e7338  [CALCITE-4295] Composite of two checkers with 
SqlOperandCountRange throws IllegalArgumentException (Zhenghua Gao)
87e7338 is described below

commit 87e7338e82f9dfb1373cee87b99f4741dd556d95
Author: Zhenghua Gao <[email protected]>
AuthorDate: Wed Sep 30 11:34:25 2020 +0800

    [CALCITE-4295] Composite of two checkers with SqlOperandCountRange throws 
IllegalArgumentException (Zhenghua Gao)
---
 .../sql/type/CompositeOperandTypeChecker.java      |  2 +-
 .../apache/calcite/test/MockSqlOperatorTable.java  | 23 ++++++++++++++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java | 12 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 12 +++++++++++
 4 files changed, 48 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java
 
b/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java
index 71bd867..4981ce9 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/type/CompositeOperandTypeChecker.java
@@ -216,7 +216,7 @@ public class CompositeOperandTypeChecker implements 
SqlOperandTypeChecker {
   private int minMin(List<SqlOperandCountRange> ranges) {
     int min = Integer.MAX_VALUE;
     for (SqlOperandCountRange range : ranges) {
-      min = Math.min(min, range.getMax());
+      min = Math.min(min, range.getMin());
     }
     return min;
   }
diff --git 
a/core/src/test/java/org/apache/calcite/test/MockSqlOperatorTable.java 
b/core/src/test/java/org/apache/calcite/test/MockSqlOperatorTable.java
index 4c8887f..407cda9 100644
--- a/core/src/test/java/org/apache/calcite/test/MockSqlOperatorTable.java
+++ b/core/src/test/java/org/apache/calcite/test/MockSqlOperatorTable.java
@@ -30,6 +30,7 @@ import org.apache.calcite.sql.SqlTableFunction;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.type.OperandTypes;
 import org.apache.calcite.sql.type.ReturnTypes;
+import org.apache.calcite.sql.type.SqlOperandCountRanges;
 import org.apache.calcite.sql.type.SqlReturnTypeInference;
 import org.apache.calcite.sql.type.SqlTypeFamily;
 import org.apache.calcite.sql.type.SqlTypeName;
@@ -70,6 +71,7 @@ public class MockSqlOperatorTable extends 
ChainedSqlOperatorTable {
     opTab.addOperator(new NotATableFunction());
     opTab.addOperator(new BadTableFunction());
     opTab.addOperator(new StructuredFunction());
+    opTab.addOperator(new CompositeFunction());
   }
 
   /** "RAMP" user-defined table function. */
@@ -257,4 +259,25 @@ public class MockSqlOperatorTable extends 
ChainedSqlOperatorTable {
           .build();
     }
   }
+
+  /** "COMPOSITE" user-defined scalar function. **/
+  public static class CompositeFunction extends SqlFunction {
+    public CompositeFunction() {
+      super("COMPOSITE",
+          new SqlIdentifier("COMPOSITE", SqlParserPos.ZERO),
+          SqlKind.OTHER_FUNCTION,
+          null,
+          null,
+          OperandTypes.or(
+              OperandTypes.variadic(SqlOperandCountRanges.from(1)),
+              OperandTypes.variadic(SqlOperandCountRanges.from(2))),
+          SqlFunctionCategory.USER_DEFINED_FUNCTION);
+    }
+
+    public RelDataType inferReturnType(SqlOperatorBinding opBinding) {
+      final RelDataTypeFactory typeFactory =
+          opBinding.getTypeFactory();
+      return typeFactory.createSqlType(SqlTypeName.BIGINT);
+    }
+  }
 }
diff --git 
a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java 
b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index 5ebf551..1d943a7 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -4110,6 +4110,18 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
   }
 
   /**
+   * Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4295";>[CALCITE-4295]
+   * Composite of two checker with SqlOperandCountRange throws 
IllegalArgumentException</a>.
+   */
+  @Test public void testCompositeOfCountRange() {
+    final String sql = ""
+        + "select COMPOSITE(deptno)\n"
+        + "from dept";
+    sql(sql).trim(true).ok();
+  }
+
+  /**
    * Visitor that checks that every {@link RelNode} in a tree is valid.
    *
    * @see RelNode#isValid(Litmus, RelNode.Context)
diff --git 
a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml 
b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 3785629..57f915e 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -7307,4 +7307,16 @@ LogicalAggregate(group=[{}], EXPR$0=[AVG($0)])
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testCompositeOfCountRange">
+        <Resource name="sql">
+            <![CDATA[select COMPOSITE(deptno)
+from dept]]>
+        </Resource>
+        <Resource name="plan">
+            <![CDATA[
+LogicalProject(EXPR$0=[COMPOSITE($0)])
+  LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+    </TestCase>
 </Root>

Reply via email to