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 2017/11/16 21:15:58 UTC
[2/2] calcite git commit: Add parameter to
SqlCallBinding.getOperandLiteralValue(int) to specify desired value type
Add parameter to SqlCallBinding.getOperandLiteralValue(int) to specify desired value type
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/e8481e50
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/e8481e50
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/e8481e50
Branch: refs/heads/master
Commit: e8481e506171a7305449b709efa03312a187aed3
Parents: 051809b
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Nov 6 15:24:58 2017 -0800
Committer: Julian Hyde <jh...@apache.org>
Committed: Wed Nov 15 22:45:49 2017 -0800
----------------------------------------------------------------------
core/src/main/codegen/templates/Parser.jj | 2 +-
.../org/apache/calcite/rex/RexCallBinding.java | 8 ++-
.../apache/calcite/sql/SqlBinaryOperator.java | 5 +-
.../org/apache/calcite/sql/SqlCallBinding.java | 6 +--
.../java/org/apache/calcite/sql/SqlLiteral.java | 53 ++++++++++++++++++--
.../apache/calcite/sql/SqlOperatorBinding.java | 9 +++-
.../sql/fun/SqlAbstractTimeFunction.java | 2 +-
.../calcite/sql/fun/SqlExtractFunction.java | 2 +-
.../sql/fun/SqlMonotonicBinaryOperator.java | 18 ++-----
.../calcite/sql/fun/SqlSubstringFunction.java | 4 +-
.../sql/fun/SqlTimestampAddFunction.java | 3 +-
.../calcite/sql2rel/SqlToRelConverter.java | 3 +-
12 files changed, 79 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/codegen/templates/Parser.jj
----------------------------------------------------------------------
diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj
index a4f7119..fb0439b 100644
--- a/core/src/main/codegen/templates/Parser.jj
+++ b/core/src/main/codegen/templates/Parser.jj
@@ -1854,7 +1854,7 @@ SqlNode TableRef2(boolean lateral) :
<SUBSTITUTE> <LPAREN> sample = StringLiteral() <RPAREN>
{
String sampleName =
- ((NlsString) SqlLiteral.value(sample)).getValue();
+ SqlLiteral.unchain(sample).getValueAs(String.class);
SqlSampleSpec sampleSpec = SqlSampleSpec.createNamed(sampleName);
final SqlLiteral sampleLiteral =
SqlLiteral.createSample(sampleSpec, s2.end(this));
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java b/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java
index fb83e70..a91eca8 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexCallBinding.java
@@ -81,8 +81,12 @@ public class RexCallBinding extends SqlOperatorBinding {
return RexLiteral.intValue(operands.get(ordinal));
}
- @Override public Comparable getOperandLiteralValue(int ordinal) {
- return RexLiteral.value(operands.get(ordinal));
+ @Override public <T> T getOperandLiteralValue(int ordinal, Class<T> clazz) {
+ final RexNode node = operands.get(ordinal);
+ if (node instanceof RexLiteral) {
+ return ((RexLiteral) node).getValueAs(clazz);
+ }
+ return clazz.cast(RexLiteral.value(node));
}
@Override public SqlMonotonicity getOperandMonotonicity(int ordinal) {
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java
index c1dece3..46cfc1e 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java
@@ -186,9 +186,8 @@ public class SqlBinaryOperator extends SqlOperator {
final SqlMonotonicity mono0 = call.getOperandMonotonicity(0);
final SqlMonotonicity mono1 = call.getOperandMonotonicity(1);
if (mono1 == SqlMonotonicity.CONSTANT) {
- final Object o = call.getOperandLiteralValue(1);
- if (o instanceof BigDecimal) {
- switch (((BigDecimal) o).compareTo(BigDecimal.ZERO)) {
+ if (call.isOperandLiteral(1, false)) {
+ switch (call.getOperandLiteralValue(1, BigDecimal.class).signum()) {
case -1:
// mono / -ve constant --> reverse mono, unstrict
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java b/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java
index 91b2ece..002382c 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlCallBinding.java
@@ -152,7 +152,7 @@ public class SqlCallBinding extends SqlOperatorBinding {
/** Returns the operands to a call permuted into the same order as the
* formal parameters of the function. */
- public List<SqlNode> permutedOperands(final SqlCall call) {
+ private List<SqlNode> permutedOperands(final SqlCall call) {
final SqlFunction operator = (SqlFunction) call.getOperator();
return Lists.transform(operator.getParamNames(),
new Function<String, SqlNode>() {
@@ -215,10 +215,10 @@ public class SqlCallBinding extends SqlOperatorBinding {
throw new AssertionError();
}
- @Override public Comparable getOperandLiteralValue(int ordinal) {
+ @Override public <T> T getOperandLiteralValue(int ordinal, Class<T> clazz) {
try {
final SqlNode node = call.operand(ordinal);
- return SqlLiteral.value(node);
+ return SqlLiteral.unchain(node).getValueAs(clazz);
} catch (IllegalArgumentException e) {
return null;
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
index 4cf88d7..815bf91 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java
@@ -261,6 +261,42 @@ public class SqlLiteral extends SqlNode {
return clazz.cast(value);
}
switch (typeName) {
+ case CHAR:
+ if (clazz == String.class) {
+ return clazz.cast(((NlsString) value).getValue());
+ }
+ break;
+ case BINARY:
+ if (clazz == byte[].class) {
+ return clazz.cast(((BitString) value).getAsByteArray());
+ }
+ break;
+ case DECIMAL:
+ if (clazz == Long.class) {
+ return clazz.cast(((BigDecimal) value).unscaledValue().longValue());
+ }
+ // fall through
+ case BIGINT:
+ case INTEGER:
+ case SMALLINT:
+ case TINYINT:
+ case DOUBLE:
+ case REAL:
+ case FLOAT:
+ if (clazz == Long.class) {
+ return clazz.cast(((BigDecimal) value).longValue());
+ } else if (clazz == Integer.class) {
+ return clazz.cast(((BigDecimal) value).intValue());
+ } else if (clazz == Short.class) {
+ return clazz.cast(((BigDecimal) value).shortValue());
+ } else if (clazz == Byte.class) {
+ return clazz.cast(((BigDecimal) value).byteValue());
+ } else if (clazz == Double.class) {
+ return clazz.cast(((BigDecimal) value).doubleValue());
+ } else if (clazz == Float.class) {
+ return clazz.cast(((BigDecimal) value).floatValue());
+ }
+ break;
case DATE:
if (clazz == Calendar.class) {
return clazz.cast(((DateString) value).toCalendar());
@@ -279,13 +315,15 @@ public class SqlLiteral extends SqlNode {
case INTERVAL_YEAR:
case INTERVAL_YEAR_MONTH:
case INTERVAL_MONTH:
+ final SqlIntervalLiteral.IntervalValue valMonth =
+ (SqlIntervalLiteral.IntervalValue) value;
if (clazz == Long.class) {
- final SqlIntervalLiteral.IntervalValue valMonth =
- (SqlIntervalLiteral.IntervalValue) value;
return clazz.cast(valMonth.getSign()
* SqlParserUtil.intervalToMonths(valMonth));
} else if (clazz == BigDecimal.class) {
return clazz.cast(BigDecimal.valueOf(getValueAs(Long.class)));
+ } else if (clazz == TimeUnitRange.class) {
+ return clazz.cast(valMonth.getIntervalQualifier().timeUnitRange);
}
break;
case INTERVAL_DAY:
@@ -298,13 +336,15 @@ public class SqlLiteral extends SqlNode {
case INTERVAL_MINUTE:
case INTERVAL_MINUTE_SECOND:
case INTERVAL_SECOND:
+ final SqlIntervalLiteral.IntervalValue valTime =
+ (SqlIntervalLiteral.IntervalValue) value;
if (clazz == Long.class) {
- final SqlIntervalLiteral.IntervalValue valTime =
- (SqlIntervalLiteral.IntervalValue) value;
return clazz.cast(valTime.getSign()
* SqlParserUtil.intervalToMillis(valTime));
} else if (clazz == BigDecimal.class) {
return clazz.cast(BigDecimal.valueOf(getValueAs(Long.class)));
+ } else if (clazz == TimeUnitRange.class) {
+ return clazz.cast(valTime.getIntervalQualifier().timeUnitRange);
}
break;
}
@@ -447,6 +487,11 @@ public class SqlLiteral extends SqlNode {
return (SqlLiteral) node;
} else if (SqlUtil.isLiteralChain(node)) {
return SqlLiteralChainOperator.concatenateOperands((SqlCall) node);
+ } else if (node instanceof SqlIntervalQualifier) {
+ final SqlIntervalQualifier q = (SqlIntervalQualifier) node;
+ return new SqlLiteral(
+ new SqlIntervalLiteral.IntervalValue(q, 1, q.toString()),
+ q.typeName(), q.pos);
} else {
throw new AssertionError("invalid literal: " + node);
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java b/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java
index 5baeaf0..5e99e6f 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlOperatorBinding.java
@@ -131,12 +131,19 @@ public abstract class SqlOperatorBinding {
* </ul>
*
* @param ordinal zero-based ordinal of operand of interest
+ * @param clazz Desired valued type
+ *
* @return value of operand
*/
- public Comparable getOperandLiteralValue(int ordinal) {
+ public <T> T getOperandLiteralValue(int ordinal, Class<T> clazz) {
throw new UnsupportedOperationException();
}
+ @Deprecated // to be removed before 2.0
+ public Comparable getOperandLiteralValue(int ordinal) {
+ return getOperandLiteralValue(ordinal, Comparable.class);
+ }
+
/**
* Determines whether a bound operand is NULL.
*
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractTimeFunction.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractTimeFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractTimeFunction.java
index 3543714..e7f75da 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractTimeFunction.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlAbstractTimeFunction.java
@@ -65,7 +65,7 @@ public class SqlAbstractTimeFunction extends SqlFunction {
if (opBinding.getOperandCount() == 1) {
RelDataType type = opBinding.getOperandType(0);
if (SqlTypeUtil.isNumeric(type)) {
- precision = ((Number) opBinding.getOperandLiteralValue(0)).intValue();
+ precision = opBinding.getOperandLiteralValue(0, Integer.class);
}
}
assert precision >= 0;
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/fun/SqlExtractFunction.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlExtractFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlExtractFunction.java
index eb31799..886c369 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlExtractFunction.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlExtractFunction.java
@@ -65,7 +65,7 @@ public class SqlExtractFunction extends SqlFunction {
}
@Override public SqlMonotonicity getMonotonicity(SqlOperatorBinding call) {
- switch ((TimeUnitRange) call.getOperandLiteralValue(0)) {
+ switch (call.getOperandLiteralValue(0, TimeUnitRange.class)) {
case YEAR:
return call.getOperandMonotonicity(1).unstrict();
default:
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
index dc35783..968f2ae 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlMonotonicBinaryOperator.java
@@ -17,7 +17,6 @@
package org.apache.calcite.sql.fun;
import org.apache.calcite.sql.SqlBinaryOperator;
-import org.apache.calcite.sql.SqlIntervalLiteral;
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.SqlOperatorBinding;
import org.apache.calcite.sql.type.SqlOperandTypeChecker;
@@ -74,7 +73,7 @@ public class SqlMonotonicBinaryOperator extends SqlBinaryOperator {
return mono0;
}
assert getName().equals("*");
- switch (signum(call.getOperandLiteralValue(1))) {
+ switch (call.getOperandLiteralValue(1, BigDecimal.class).signum()) {
case -1:
// mono0 * negative constant --> reverse mono0
return mono0.reverse();
@@ -100,9 +99,8 @@ public class SqlMonotonicBinaryOperator extends SqlBinaryOperator {
return mono1;
}
assert getName().equals("*");
- final Object v0 = call.getOperandLiteralValue(0);
- if (v0 != null) {
- switch (signum(v0)) {
+ if (!call.isOperandNull(0, true)) {
+ switch (call.getOperandLiteralValue(0, BigDecimal.class).signum()) {
case -1:
// negative constant * mono1 --> reverse mono1
return mono1.reverse();
@@ -151,16 +149,6 @@ public class SqlMonotonicBinaryOperator extends SqlBinaryOperator {
return super.getMonotonicity(call);
}
-
- private int signum(Object o) {
- if (o instanceof BigDecimal) {
- return ((BigDecimal) o).signum();
- } else if (o instanceof SqlIntervalLiteral.IntervalValue) {
- return ((SqlIntervalLiteral.IntervalValue) o).getSign();
- } else {
- return 1;
- }
- }
}
// End SqlMonotonicBinaryOperator.java
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/fun/SqlSubstringFunction.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlSubstringFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlSubstringFunction.java
index f669a8a..631e778 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlSubstringFunction.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlSubstringFunction.java
@@ -195,8 +195,8 @@ public class SqlSubstringFunction extends SqlFunction {
final SqlMonotonicity mono0 = call.getOperandMonotonicity(0);
if ((mono0 != SqlMonotonicity.NOT_MONOTONIC)
&& call.getOperandMonotonicity(1) == SqlMonotonicity.CONSTANT
- && call.getOperandLiteralValue(1) instanceof BigDecimal
- && call.getOperandLiteralValue(1).equals(BigDecimal.ZERO)
+ && call.getOperandLiteralValue(1, BigDecimal.class)
+ .equals(BigDecimal.ZERO)
&& call.getOperandMonotonicity(2) == SqlMonotonicity.CONSTANT) {
return mono0.unstrict();
}
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java
index b71bfec..a4861f9 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlTimestampAddFunction.java
@@ -60,8 +60,7 @@ class SqlTimestampAddFunction extends SqlFunction {
new SqlReturnTypeInference() {
public RelDataType inferReturnType(SqlOperatorBinding opBinding) {
final RelDataTypeFactory typeFactory = opBinding.getTypeFactory();
- final TimeUnit unit = (TimeUnit) opBinding.getOperandLiteralValue(0);
- switch (unit) {
+ switch (opBinding.getOperandLiteralValue(0, TimeUnit.class)) {
case HOUR:
case MINUTE:
case SECOND:
http://git-wip-us.apache.org/repos/asf/calcite/blob/e8481e50/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
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 bbe7b68..08fc4b0 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -2297,7 +2297,8 @@ public class SqlToRelConverter {
SqlCall call) {
final SqlOperator operator = call.getOperator();
if (operator == SqlStdOperatorTable.TABLESAMPLE) {
- final String sampleName = (String) SqlLiteral.value(call.operand(0));
+ final String sampleName =
+ SqlLiteral.unchain(call.operand(0)).getValueAs(String.class);
datasetStack.push(sampleName);
SqlCall cursorCall = call.operand(1);
SqlNode query = cursorCall.operand(0);