You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2013/12/27 01:22:06 UTC
git commit: TAJO-452: Timstamp literal with fractional seconds
results in java.lang.ArrayIndexOutOfBoundsException. (Keuntae Park via
hyunsik).
Updated Branches:
refs/heads/master 7306ba324 -> 319a37725
TAJO-452: Timstamp literal with fractional seconds results in java.lang.ArrayIndexOutOfBoundsException. (Keuntae Park via hyunsik).
Project: http://git-wip-us.apache.org/repos/asf/incubator-tajo/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tajo/commit/319a3772
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tajo/tree/319a3772
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tajo/diff/319a3772
Branch: refs/heads/master
Commit: 319a37725feb5fe4fa04280da4fd11fd24406960
Parents: 7306ba3
Author: Hyunsik Choi <hy...@apache.org>
Authored: Fri Dec 27 09:21:13 2013 +0900
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Fri Dec 27 09:21:13 2013 +0900
----------------------------------------------------------------------
CHANGES.txt | 5 ++++-
.../src/main/java/org/apache/tajo/algebra/TimeValue.java | 3 ++-
.../src/main/java/org/apache/tajo/datum/TimestampDatum.java | 8 +++++++-
.../src/main/java/org/apache/tajo/json/DatumAdapter.java | 5 +++--
.../main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java | 2 +-
.../org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java | 8 ++++++++
6 files changed, 25 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/319a3772/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e1c460e..858b185 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -172,7 +172,10 @@ Release 0.8.0 - unreleased
BUG FIXES
- TAJO-452: pass invalid argument to DateTime constructor in LogicalPlanner.
+ TAJO-452: Timstamp literal with fractional seconds results in
+ java.lang.ArrayIndexOutOfBoundsException. (Keuntae Park via hyunsik)
+
+ TAJO-454: pass invalid argument to DateTime constructor in LogicalPlanner.
(DaeMyung Kang via hyunsik)
TAJO-451: Update documentation and version constant for Tajo 0.8.
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/319a3772/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
----------------------------------------------------------------------
diff --git a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
index 916c3d2..b41b644 100644
--- a/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
+++ b/tajo-algebra/src/main/java/org/apache/tajo/algebra/TimeValue.java
@@ -19,6 +19,7 @@
package org.apache.tajo.algebra;
import com.google.common.base.Objects;
+import org.apache.commons.lang.StringUtils;
public class TimeValue {
private String hours;
@@ -49,7 +50,7 @@ public class TimeValue {
}
public void setSecondsFraction(String secondsFraction) {
- this.secondsFraction = secondsFraction;
+ this.secondsFraction = StringUtils.rightPad(secondsFraction, 3, '0');
}
public String getSecondsFraction() {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/319a3772/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
index 4799964..ff3cc3b 100644
--- a/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
+++ b/tajo-common/src/main/java/org/apache/tajo/datum/TimestampDatum.java
@@ -29,7 +29,9 @@ public class TimestampDatum extends Datum {
public static final int SIZE = 8;
/** ISO 8601/SQL standard format - ex) 1997-12-17 07:37:16-08 */
public static final String DEFAULT_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss";
+ public static final String FRACTION_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss.SSS";
private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormat.forPattern(DEFAULT_FORMAT_STRING);
+ private static final DateTimeFormatter FRACTION_FORMATTER = DateTimeFormat.forPattern(FRACTION_FORMAT_STRING);
private DateTime dateTime;
public TimestampDatum(int timestamp) {
@@ -106,7 +108,11 @@ public class TimestampDatum extends Datum {
@Override
public String asChars() {
- return dateTime.toString(DEFAULT_FORMATTER);
+ if (getMillisOfSecond() > 0) {
+ return dateTime.toString(FRACTION_FORMATTER);
+ } else {
+ return dateTime.toString(DEFAULT_FORMATTER);
+ }
}
public String toChars(DateTimeFormatter format) {
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/319a3772/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
index daece65..f24d213 100644
--- a/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
+++ b/tajo-common/src/main/java/org/apache/tajo/json/DatumAdapter.java
@@ -21,6 +21,7 @@ package org.apache.tajo.json;
import com.google.gson.*;
import org.apache.tajo.common.TajoDataTypes;
import org.apache.tajo.datum.*;
+import org.joda.time.DateTime;
import java.lang.reflect.Type;
@@ -38,7 +39,7 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
case TIME:
return new TimeDatum(jsonObject.get("value").getAsLong());
case TIMESTAMP:
- return new TimestampDatum(jsonObject.get("value").getAsString());
+ return new TimestampDatum(new DateTime(jsonObject.get("value").getAsLong()));
default:
return context.deserialize(jsonObject.get("body"),
DatumFactory.getDatumClass(TajoDataTypes.Type.valueOf(typeName)));
@@ -57,7 +58,7 @@ public class DatumAdapter implements GsonSerDerAdapter<Datum> {
jsonObj.addProperty("value", src.asInt8());
break;
case TIMESTAMP:
- jsonObj.addProperty("value", src.asChars());
+ jsonObj.addProperty("value", ((TimestampDatum)src).getMillis());
break;
default:
jsonObj.add("body", context.serialize(src));
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/319a3772/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
index 54a90da..a096e7d 100644
--- a/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
+++ b/tajo-core/tajo-core-backend/src/main/java/org/apache/tajo/engine/parser/SQLAnalyzer.java
@@ -1298,7 +1298,7 @@ public class SQLAnalyzer extends SQLParserBaseVisitor<Expr> {
TimeValue time;
boolean hasFractionOfSeconds = parts[2].indexOf('.') > 0;
if (hasFractionOfSeconds) {
- String [] secondsParts = parts[2].split(".");
+ String [] secondsParts = parts[2].split("\\.");
time = new TimeValue(parts[0], parts[1], secondsParts[0]);
if (secondsParts.length == 2) {
time.setSecondsFraction(secondsParts[1]);
http://git-wip-us.apache.org/repos/asf/incubator-tajo/blob/319a3772/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
----------------------------------------------------------------------
diff --git a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
index 9eb4d1d..cc38dea 100644
--- a/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
+++ b/tajo-core/tajo-core-backend/src/test/java/org/apache/tajo/engine/eval/TestSQLDateTimeTypes.java
@@ -25,6 +25,14 @@ import java.io.IOException;
public class TestSQLDateTimeTypes extends ExprTestBase {
@Test
+ public void testTimestamp() throws IOException {
+ testSimpleEval("select TIMESTAMP '1970-01-17 10:09:37';", new String[]{"1970-01-17 10:09:37"});
+ testSimpleEval("select TIMESTAMP '1970-01-17 10:09:37.5';", new String[]{"1970-01-17 10:09:37.500"});
+ testSimpleEval("select TIMESTAMP '1970-01-17 10:09:37.01';", new String[]{"1970-01-17 10:09:37.010"});
+ testSimpleEval("select TIMESTAMP '1970-01-17 10:09:37.003';", new String[]{"1970-01-17 10:09:37.003"});
+ }
+
+ @Test
public void testToTimestamp() throws IOException {
testSimpleEval("select to_char(TIMESTAMP '1970-01-17 10:09:37', 'yyyy-MM-dd HH:mm:ss');",
new String[]{"1970-01-17 10:09:37"});