You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2016/07/08 21:01:32 UTC

calcite git commit: [CALCITE-1310] Infer type of arguments to BETWEEN operator (Yiming Liu)

Repository: calcite
Updated Branches:
  refs/heads/master 2193c6e6e -> 63c51d0c6


[CALCITE-1310] Infer type of arguments to BETWEEN operator (Yiming Liu)

Close apache/calcite#252


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/63c51d0c
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/63c51d0c
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/63c51d0c

Branch: refs/heads/master
Commit: 63c51d0c6459a4de5cab01188a7f3b7dd1a259fb
Parents: 2193c6e
Author: Yiming Liu <li...@gmail.com>
Authored: Fri Jul 8 14:36:28 2016 +0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Jul 8 12:36:19 2016 -0700

----------------------------------------------------------------------
 .../apache/calcite/sql/fun/SqlBetweenOperator.java  | 13 ++++---------
 .../test/java/org/apache/calcite/test/JdbcTest.java | 16 ++++++++++++++++
 .../org/apache/calcite/test/SqlValidatorTest.java   | 12 ++++++++++++
 3 files changed, 32 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/63c51d0c/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
index c4358d1..86660a2 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java
@@ -31,6 +31,7 @@ import org.apache.calcite.sql.SqlWriter;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.parser.SqlParserUtil;
 import org.apache.calcite.sql.type.ComparableOperandTypeChecker;
+import org.apache.calcite.sql.type.InferTypes;
 import org.apache.calcite.sql.type.ReturnTypes;
 import org.apache.calcite.sql.type.SqlOperandTypeChecker;
 import org.apache.calcite.sql.type.SqlTypeUtil;
@@ -107,15 +108,9 @@ public class SqlBetweenOperator extends SqlInfixOperator {
 
   //~ Constructors -----------------------------------------------------------
 
-  public SqlBetweenOperator(
-      Flag flag,
-      boolean negated) {
-    super(
-        negated ? NOT_BETWEEN_NAMES : BETWEEN_NAMES,
-        SqlKind.BETWEEN,
-        30,
-        null,
-        null, OTC_CUSTOM);
+  public SqlBetweenOperator(Flag flag, boolean negated) {
+    super(negated ? NOT_BETWEEN_NAMES : BETWEEN_NAMES, SqlKind.BETWEEN, 30,
+        null, InferTypes.FIRST_KNOWN, OTC_CUSTOM);
     this.flag = flag;
     this.negated = negated;
   }

http://git-wip-us.apache.org/repos/asf/calcite/blob/63c51d0c/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 2c0b513..7721163 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -4942,7 +4942,23 @@ public class JdbcTest {
                       "deptno=10; name=Theodore\n",
                       CalciteAssert.toString(resultSet));
 
+                  // Now BETWEEN, with 3 arguments, 2 of which are parameters
+                  final String sql2 = "select \"deptno\", \"name\" "
+                      + "from \"hr\".\"emps\"\n"
+                      + "where \"deptno\" between symmetric ? and ?\n"
+                      + "order by 2";
+                  final PreparedStatement preparedStatement2 =
+                      connection.prepareStatement(sql2);
+                  preparedStatement2.setInt(1, 15);
+                  preparedStatement2.setInt(2, 5);
+                  resultSet = preparedStatement2.executeQuery();
+                  assertThat(CalciteAssert.toString(resultSet),
+                      is("deptno=10; name=Bill\n"
+                          + "deptno=10; name=Sebastian\n"
+                          + "deptno=10; name=Theodore\n"));
+
                   resultSet.close();
+                  preparedStatement2.close();
                   preparedStatement.close();
                   return null;
                 } catch (SQLException e) {

http://git-wip-us.apache.org/repos/asf/calcite/blob/63c51d0c/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.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 02e29c1..57f71d1 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -6573,6 +6573,18 @@ public class SqlValidatorTest extends SqlValidatorTestCase {
     sql("select 1 from emp having sum(sal) < ?").ok();
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-1310">[CALCITE-1310]
+   * Infer type of arguments to BETWEEN operator</a>. */
+  @Test public void testBindBetween() {
+    sql("select * from emp where ename between ? and ?").ok();
+    sql("select * from emp where deptno between ? and ?").ok();
+    sql("select * from emp where ? between deptno and ?").ok();
+    sql("select * from emp where ? between ? and deptno").ok();
+    sql("select * from emp where ^?^ between ? and ?")
+        .fails("Illegal use of dynamic parameter");
+  }
+
   @Test public void testUnnest() {
     checkColumnType("select*from unnest(multiset[1])", "INTEGER NOT NULL");
     checkColumnType("select*from unnest(multiset[1, 2])", "INTEGER NOT NULL");