This is an automated email from the ASF dual-hosted git repository.
yanlin 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 51c0d92 [CALCITE-4584] Using function in partition by list of over
window cause converting exception (Wang Yanlin)
51c0d92 is described below
commit 51c0d925489b57319502ffdebbdd93b6fe4e1e8a
Author: yanlin-Lynn <[email protected]>
AuthorDate: Thu Apr 15 19:50:23 2021 +0800
[CALCITE-4584] Using function in partition by list of over window cause
converting exception (Wang Yanlin)
---
.../apache/calcite/sql2rel/SqlToRelConverter.java | 1 +
.../apache/calcite/test/SqlToRelConverterTest.java | 12 +++++++-
.../org/apache/calcite/test/SqlToRelTestBase.java | 32 +++++++++++++++++++++-
.../apache/calcite/test/SqlToRelConverterTest.xml | 15 ++++++++++
4 files changed, 58 insertions(+), 2 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index 868b252..e5bdf4a 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -2034,6 +2034,7 @@ public class SqlToRelConverter {
final ImmutableList.Builder<RexNode> partitionKeys =
ImmutableList.builder();
for (SqlNode partition : partitionList) {
+ validator().deriveType(bb.scope(), partition);
partitionKeys.add(bb.convertExpression(partition));
}
final RexNode lowerBound = bb.convertExpression(
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 11bad99..5fee9f3 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -4317,12 +4317,22 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
sql(sql).trim(true).ok();
}
-
@Test public void testInWithConstantList() {
String expr = "1 in (1,2,3)";
expr(expr).ok();
}
+ @Test public void testFunctionExprInOver() {
+ String sql = "select ename, row_number() over(partition by
char_length(ename)\n"
+ + " order by deptno desc) as rn\n"
+ + "from emp\n"
+ + "where deptno = 10";
+ Tester newTester = tester.withValidatorTransform(
+ sqlValidator -> sqlValidator.transform(
+ config -> config.withIdentifierExpansion(false)));
+ newTester.assertConvertsTo(sql, "${plan}", false);
+ }
+
/**
* Visitor that checks that every {@link RelNode} in a tree is valid.
*
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
b/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
index 85d581b..6492619 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelTestBase.java
@@ -298,6 +298,10 @@ public abstract class SqlToRelTestBase {
RelNode trimRelNode(RelNode relNode);
SqlNode parseExpression(String expr) throws Exception;
+
+ /** Returns a tester that applies the given transform to a validator before
+ * using it. */
+ Tester withValidatorTransform(UnaryOperator<SqlValidator> transform);
}
//~ Inner Classes ----------------------------------------------------------
@@ -574,6 +578,7 @@ public abstract class SqlToRelTestBase {
private final Supplier<RelDataTypeFactory> typeFactorySupplier;
private final UnaryOperator<SqlToRelConverter.Config> configTransform;
private final UnaryOperator<Context> contextTransform;
+ private final UnaryOperator<SqlValidator> validatorTransform;
/** Creates a TesterImpl with default options. */
protected TesterImpl(DiffRepository diffRepos) {
@@ -600,6 +605,22 @@ public abstract class SqlToRelTestBase {
UnaryOperator<SqlToRelConverter.Config> configTransform,
SqlConformance conformance, UnaryOperator<Context> contextTransform,
Supplier<RelDataTypeFactory> typeFactorySupplier) {
+ this(diffRepos, enableDecorrelate, enableTrim, enableLateDecorrelate,
+ enableTypeCoercion, catalogReaderFactory, clusterFactory,
plannerFactory,
+ configTransform, conformance, contextTransform, typeFactorySupplier,
+ transform -> transform);
+ }
+
+ protected TesterImpl(DiffRepository diffRepos, boolean enableDecorrelate,
+ boolean enableTrim, boolean enableLateDecorrelate,
+ boolean enableTypeCoercion,
+ SqlTestFactory.MockCatalogReaderFactory catalogReaderFactory,
+ Function<RelOptCluster, RelOptCluster> clusterFactory,
+ Function<Context, RelOptPlanner> plannerFactory,
+ UnaryOperator<SqlToRelConverter.Config> configTransform,
+ SqlConformance conformance, UnaryOperator<Context> contextTransform,
+ Supplier<RelDataTypeFactory> typeFactorySupplier,
+ UnaryOperator<SqlValidator> validatorTransform) {
this.diffRepos = diffRepos;
this.enableDecorrelate = enableDecorrelate;
this.enableTrim = enableTrim;
@@ -612,6 +633,7 @@ public abstract class SqlToRelTestBase {
this.conformance = Objects.requireNonNull(conformance, "conformance");
this.contextTransform = Objects.requireNonNull(contextTransform,
"contextTransform");
this.typeFactorySupplier = Objects.requireNonNull(typeFactorySupplier,
"typeFactorySupplier");
+ this.validatorTransform = Objects.requireNonNull(validatorTransform,
"validatorTransform");
}
public RelRoot convertSqlToRel(String sql) {
@@ -736,7 +758,7 @@ public abstract class SqlToRelTestBase {
if (conformance.allowGeometry()) {
list.add(SqlOperatorTables.spatialInstance());
}
- return new FarragoTestValidator(
+ SqlValidator validator = new FarragoTestValidator(
SqlOperatorTables.chain(list),
catalogReader,
typeFactory,
@@ -744,6 +766,7 @@ public abstract class SqlToRelTestBase {
.withSqlConformance(conformance)
.withTypeCoercionEnabled(enableTypeCoercion)
.withIdentifierExpansion(true));
+ return validatorTransform.apply(validator);
}
public final SqlOperatorTable getOperatorTable() {
@@ -991,6 +1014,13 @@ public abstract class SqlToRelTestBase {
public boolean isLateDecorrelate() {
return enableLateDecorrelate;
}
+
+ public Tester withValidatorTransform(UnaryOperator<SqlValidator>
transform) {
+ return new TesterImpl(diffRepos, enableDecorrelate, enableTrim,
+ enableLateDecorrelate, enableTypeCoercion, catalogReaderFactory,
+ clusterFactory, plannerFactory, configTransform, conformance,
+ contextTransform, typeFactorySupplier, transform);
+ }
}
/** Validator for testing. */
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 8c12af1..39b92d2 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -1646,6 +1646,21 @@ LogicalProject(EXPR$0=[ROW(ITEM($3, 1).EMPNO, ITEM($3,
1).ENAME, ROW(ITEM($3, 1)
]]>
</Resource>
</TestCase>
+ <TestCase name="testFunctionExprInOver">
+ <Resource name="sql">
+ <![CDATA[select ename, row_number() over(partition by char_length(ename)
+order by deptno desc) as rn
+from emp
+where deptno = 10]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalProject(ENAME=[$1], RN=[ROW_NUMBER() OVER (PARTITION BY CHAR_LENGTH($1)
ORDER BY $7 DESC)])
+ LogicalFilter(condition=[=($7, 10)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testFunctionWithStructInput">
<Resource name="sql">
<![CDATA[select json_type(skill)