[feature](function) support now/current_timestamp functions with precision (#12219)
* [feature](function) support now/current_timestamp functions with precision
This commit is contained in:
@ -81,6 +81,7 @@ import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collection;
|
||||
@ -550,6 +551,7 @@ public class Analyzer {
|
||||
Calendar currentDate = Calendar.getInstance();
|
||||
String nowStr = formatter.format(currentDate.getTime());
|
||||
queryGlobals.setNowString(nowStr);
|
||||
queryGlobals.setNanoSeconds(LocalDateTime.now().getNano());
|
||||
return queryGlobals;
|
||||
}
|
||||
|
||||
|
||||
@ -82,6 +82,10 @@ public class FunctionCallExpr extends Expr {
|
||||
.addAll(DECIMAL_SAME_TYPE_SET)
|
||||
.addAll(DECIMAL_WIDER_TYPE_SET)
|
||||
.addAll(STDDEV_FUNCTION_SET).build();
|
||||
|
||||
private static final ImmutableSet<String> TIME_FUNCTIONS_WITH_PRECISION =
|
||||
new ImmutableSortedSet.Builder(String.CASE_INSENSITIVE_ORDER)
|
||||
.add("now").add("current_timestamp").add("localtime").add("localtimestamp").build();
|
||||
private static final int STDDEV_DECIMAL_SCALE = 9;
|
||||
private static final String ELEMENT_EXTRACT_FN_NAME = "%element_extract%";
|
||||
|
||||
@ -1036,6 +1040,15 @@ public class FunctionCallExpr extends Expr {
|
||||
}
|
||||
}
|
||||
|
||||
if (TIME_FUNCTIONS_WITH_PRECISION.contains(fnName.getFunction().toLowerCase())
|
||||
&& fn != null && fn.getReturnType().isDatetimeV2()) {
|
||||
if (children.size() == 1 && children.get(0) instanceof IntLiteral) {
|
||||
fn.setReturnType(ScalarType.createDatetimeV2Type((int) ((IntLiteral) children.get(0)).getLongValue()));
|
||||
} else if (children.size() == 1) {
|
||||
fn.setReturnType(ScalarType.createDatetimeV2Type(6));
|
||||
}
|
||||
}
|
||||
|
||||
if (fnName.getFunction().equalsIgnoreCase("from_unixtime")
|
||||
|| fnName.getFunction().equalsIgnoreCase("date_format")) {
|
||||
// if has only one child, it has default time format: yyyy-MM-dd HH:mm:ss.SSSSSS
|
||||
|
||||
@ -61,6 +61,7 @@ import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -204,6 +205,7 @@ public class StreamLoadPlanner {
|
||||
queryGlobals.setTimestampMs(System.currentTimeMillis());
|
||||
queryGlobals.setTimeZone(taskInfo.getTimezone());
|
||||
queryGlobals.setLoadZeroTolerance(taskInfo.getMaxFilterRatio() <= 0.0);
|
||||
queryGlobals.setNanoSeconds(LocalDateTime.now().getNano());
|
||||
|
||||
params.setQueryGlobals(queryGlobals);
|
||||
|
||||
|
||||
@ -115,6 +115,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
@ -251,6 +252,7 @@ public class Coordinator {
|
||||
|
||||
this.queryGlobals.setNowString(DATE_FORMAT.format(new Date()));
|
||||
this.queryGlobals.setTimestampMs(System.currentTimeMillis());
|
||||
this.queryGlobals.setNanoSeconds(LocalDateTime.now().getNano());
|
||||
this.queryGlobals.setLoadZeroTolerance(false);
|
||||
if (context.getSessionVariable().getTimeZone().equals("CST")) {
|
||||
this.queryGlobals.setTimeZone(TimeUtils.DEFAULT_TIME_ZONE);
|
||||
|
||||
@ -55,6 +55,7 @@ import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
@ -353,6 +354,7 @@ public class FoldConstantsRule implements ExprRewriteRule {
|
||||
TQueryGlobals queryGlobals = new TQueryGlobals();
|
||||
queryGlobals.setNowString(DATE_FORMAT.format(new Date()));
|
||||
queryGlobals.setTimestampMs(System.currentTimeMillis());
|
||||
queryGlobals.setNanoSeconds(LocalDateTime.now().getNano());
|
||||
queryGlobals.setTimeZone(TimeUtils.DEFAULT_TIME_ZONE);
|
||||
if (context.getSessionVariable().getTimeZone().equals("CST")) {
|
||||
queryGlobals.setTimeZone(TimeUtils.DEFAULT_TIME_ZONE);
|
||||
|
||||
Reference in New Issue
Block a user