|
16 | 16 | import com.facebook.presto.common.function.OperatorType; |
17 | 17 | import com.facebook.presto.common.type.DecimalType; |
18 | 18 | import com.facebook.presto.common.type.RowType; |
| 19 | +import com.facebook.presto.common.type.TimestampType; |
19 | 20 | import com.facebook.presto.common.type.Type; |
20 | 21 | import com.facebook.presto.common.type.VarcharType; |
21 | 22 | import com.facebook.presto.plugin.clp.ClpColumnHandle; |
|
64 | 65 | import static java.lang.Integer.parseInt; |
65 | 66 | import static java.lang.String.format; |
66 | 67 | import static java.util.Objects.requireNonNull; |
| 68 | +import static java.util.concurrent.TimeUnit.SECONDS; |
67 | 69 |
|
68 | 70 | /** |
69 | 71 | * A translator to translate Presto {@link RowExpression}s into: |
@@ -259,8 +261,10 @@ private ClpExpression handleBetween(CallExpression node) |
259 | 261 | } |
260 | 262 |
|
261 | 263 | String variable = variableOpt.get(); |
262 | | - String lowerBound = getLiteralString((ConstantExpression) second); |
263 | | - String upperBound = getLiteralString((ConstantExpression) third); |
| 264 | + Type lowerBoundType = second.getType(); |
| 265 | + String lowerBound = tryEnsureNanosecondTimestamp(lowerBoundType, getLiteralString((ConstantExpression) second)); |
| 266 | + Type upperBoundType = third.getType(); |
| 267 | + String upperBound = tryEnsureNanosecondTimestamp(upperBoundType, getLiteralString((ConstantExpression) third)); |
264 | 268 | String kql = String.format("%s >= %s AND %s <= %s", variable, lowerBound, variable, upperBound); |
265 | 269 | String metadataSqlQuery = metadataFilterColumns.contains(variable) |
266 | 270 | ? String.format("\"%s\" >= %s AND \"%s\" <= %s", variable, lowerBound, variable, upperBound) |
@@ -443,6 +447,7 @@ private ClpExpression buildClpExpression( |
443 | 447 | RowExpression originalNode) |
444 | 448 | { |
445 | 449 | String metadataSqlQuery = null; |
| 450 | + literalString = tryEnsureNanosecondTimestamp(literalType, literalString); |
446 | 451 | if (operator.equals(EQUAL)) { |
447 | 452 | if (literalType instanceof VarcharType) { |
448 | 453 | return new ClpExpression( |
@@ -939,6 +944,26 @@ public static boolean isClpCompatibleNumericType(Type type) |
939 | 944 | || type instanceof DecimalType; |
940 | 945 | } |
941 | 946 |
|
| 947 | + private static String tryEnsureNanosecondTimestamp(Type type, String literalString) |
| 948 | + { |
| 949 | + if (type == TIMESTAMP) { |
| 950 | + return ensureNanosecondTimestamp(TIMESTAMP, literalString); |
| 951 | + } |
| 952 | + else if (type == TIMESTAMP_MICROSECONDS) { |
| 953 | + return ensureNanosecondTimestamp(TIMESTAMP_MICROSECONDS, literalString); |
| 954 | + } |
| 955 | + return literalString; |
| 956 | + } |
| 957 | + |
| 958 | + private static String ensureNanosecondTimestamp(TimestampType type, String literalString) |
| 959 | + { |
| 960 | + long literalNumber = Long.parseLong(literalString); |
| 961 | + long seconds = type.getEpochSecond(literalNumber); |
| 962 | + long nanosecondFraction = type.getNanos(literalNumber); |
| 963 | + long nanoseconds = SECONDS.toNanos(seconds) + nanosecondFraction; |
| 964 | + return Long.toString(nanoseconds); |
| 965 | + } |
| 966 | + |
942 | 967 | private static class SubstrInfo |
943 | 968 | { |
944 | 969 | String variableName; |
|
0 commit comments