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>