提交 9ea0a1df authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Fix column type for EXTRACT with EPOCH

上级 ebf3fcd7
...@@ -2197,6 +2197,20 @@ public class Function extends Expression implements FunctionCall { ...@@ -2197,6 +2197,20 @@ public class Function extends Expression implements FunctionCall {
long p; long p;
Expression p0 = args.length < 1 ? null : args[0]; Expression p0 = args.length < 1 ? null : args[0];
switch (info.type) { switch (info.type) {
case EXTRACT: {
if (p0.isConstant() && DateTimeFunctions.getDatePart(p0.getValue(session).getString()) == Function.EPOCH) {
t = Value.DECIMAL;
p = ValueLong.PRECISION + ValueTimestamp.MAXIMUM_SCALE;
s = ValueTimestamp.MAXIMUM_SCALE;
d = ValueLong.PRECISION + ValueTimestamp.MAXIMUM_SCALE + 1;
} else {
t = Value.INT;
p = ValueInt.PRECISION;
s = 0;
d = ValueInt.DISPLAY_SIZE;
}
break;
}
case DATE_TRUNC: { case DATE_TRUNC: {
Expression p1 = args[1]; Expression p1 = args[1];
t = p1.getType(); t = p1.getType();
......
...@@ -576,7 +576,14 @@ public final class DateTimeFunctions { ...@@ -576,7 +576,14 @@ public final class DateTimeFunctions {
} }
} }
private static int getDatePart(String part) { /**
* Get date part function number from part name.
*
* @param part
* name of the part
* @return function number
*/
public static int getDatePart(String part) {
Integer p = DATE_PART.get(StringUtils.toUpperEnglish(part)); Integer p = DATE_PART.get(StringUtils.toUpperEnglish(part));
if (p == null) { if (p == null) {
throw DbException.getInvalidValueException("date part", part); throw DbException.getInvalidValueException("date part", part);
......
...@@ -114,6 +114,7 @@ public class TestFunctions extends TestDb implements AggregateFunction { ...@@ -114,6 +114,7 @@ public class TestFunctions extends TestDb implements AggregateFunction {
testConcatWs(); testConcatWs();
testTruncate(); testTruncate();
testDateTrunc(); testDateTrunc();
testExtract();
testToCharFromDateTime(); testToCharFromDateTime();
testToCharFromNumber(); testToCharFromNumber();
testToCharFromText(); testToCharFromText();
...@@ -1257,6 +1258,19 @@ public class TestFunctions extends TestDb implements AggregateFunction { ...@@ -1257,6 +1258,19 @@ public class TestFunctions extends TestDb implements AggregateFunction {
conn.close(); conn.close();
} }
private void testExtract() throws SQLException {
deleteDb("functions");
Connection conn = getConnection("functions");
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST(TS TIMESTAMP)");
stat.execute("INSERT INTO TEST VALUES ('2010-01-01 10:11:12')");
assertEquals(Types.INTEGER, stat.executeQuery("SELECT EXTRACT(DAY FROM TS) FROM TEST")
.getMetaData().getColumnType(1));
assertEquals(Types.DECIMAL, stat.executeQuery("SELECT EXTRACT(EPOCH FROM TS) FROM TEST")
.getMetaData().getColumnType(1));
conn.close();
}
private void testTranslate() throws SQLException { private void testTranslate() throws SQLException {
Connection conn = getConnection("functions"); Connection conn = getConnection("functions");
Statement stat = conn.createStatement(); Statement stat = conn.createStatement();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论