You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2019/11/12 01:20:47 UTC

[calcite] branch master updated: [CALCITE-3476] ParameterScope should override resolveColumn interface (Jark Wu)

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

danny0405 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 da2b2ef  [CALCITE-3476] ParameterScope should override resolveColumn interface (Jark Wu)
da2b2ef is described below

commit da2b2efa437d0d7d33f99797ffa1f566781f9fa8
Author: Jark Wu <ja...@apache.org>
AuthorDate: Sun Nov 10 21:26:52 2019 +0800

    [CALCITE-3476] ParameterScope should override resolveColumn interface (Jark Wu)
    
    The SqlValidator#validateParameterizedExpression is a useful method to
    validate a sql expression given the name to type mapping. Although it is
    not used internal for Calcite, we better to fix it in order that other
    systems can use it.
    
    close apache/calcite#1570
---
 .../apache/calcite/sql/validate/ParameterScope.java |  4 ++++
 .../org/apache/calcite/test/SqlValidatorTest.java   | 21 +++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java b/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java
index c9a0484..4e74868 100644
--- a/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java
+++ b/core/src/main/java/org/apache/calcite/sql/validate/ParameterScope.java
@@ -19,6 +19,7 @@ package org.apache.calcite.sql.validate;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlNode;
 
 import java.util.Map;
 
@@ -56,6 +57,9 @@ public class ParameterScope extends EmptyScope {
     return this;
   }
 
+  @Override public RelDataType resolveColumn(String name, SqlNode ctx) {
+    return nameToTypeMap.get(name);
+  }
 }
 
 // End ParameterScope.java
diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
index ee42e28..f4418d4 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -21,6 +21,7 @@ import org.apache.calcite.avatica.util.Quoting;
 import org.apache.calcite.avatica.util.TimeUnit;
 import org.apache.calcite.config.Lex;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.rel.type.RelDataTypeSystem;
 import org.apache.calcite.runtime.CalciteContextException;
 import org.apache.calcite.sql.SqlCollation;
@@ -31,6 +32,7 @@ import org.apache.calcite.sql.SqlSpecialOperator;
 import org.apache.calcite.sql.fun.SqlLibrary;
 import org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
+import org.apache.calcite.sql.parser.SqlParseException;
 import org.apache.calcite.sql.parser.SqlParser;
 import org.apache.calcite.sql.type.ArraySqlType;
 import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
@@ -63,8 +65,10 @@ import java.lang.reflect.Method;
 import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Objects;
 import java.util.function.Consumer;
 
@@ -11206,6 +11210,23 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
     }
   }
 
+  @Test public void testValidateParameterizedExpression() throws SqlParseException {
+    final SqlParser.Config config = configBuilder().build();
+    final SqlValidator validator = tester.getValidator();
+    final RelDataTypeFactory typeFactory = validator.getTypeFactory();
+    final RelDataType intType = typeFactory.createSqlType(SqlTypeName.INTEGER);
+    final RelDataType intTypeNull = typeFactory.createTypeWithNullability(intType, true);
+    final Map<String, RelDataType> nameToTypeMap = new HashMap<>();
+    nameToTypeMap.put("A", intType);
+    nameToTypeMap.put("B", intTypeNull);
+    final String expr = "a + b";
+    final SqlParser parser = SqlParser.create(expr, config);
+    final SqlNode sqlNode = parser.parseExpression();
+    final SqlNode validated = validator.validateParameterizedExpression(sqlNode, nameToTypeMap);
+    final RelDataType resultType = validator.getValidatedNodeType(validated);
+    assertThat(resultType.toString(), is("INTEGER"));
+  }
+
 }
 
 // End SqlValidatorTest.java