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)

Reply via email to