[FIX](array )fix array<null> literal in fe (#27750)
This commit is contained in:
@ -18,6 +18,7 @@
|
||||
package org.apache.doris.analysis;
|
||||
|
||||
import org.apache.doris.catalog.ArrayType;
|
||||
import org.apache.doris.catalog.ScalarType;
|
||||
import org.apache.doris.catalog.Type;
|
||||
import org.apache.doris.common.AnalysisException;
|
||||
import org.apache.doris.thrift.TExprNode;
|
||||
@ -129,6 +130,22 @@ public class ArrayLiteral extends LiteralExpr {
|
||||
return "[" + StringUtils.join(list, ", ") + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getStringValueInFe() {
|
||||
List<String> list = new ArrayList<>(children.size());
|
||||
children.forEach(v -> {
|
||||
// we should use type to decide we output array is suitable for json format
|
||||
if (!(v instanceof NullLiteral) && v.getType().isScalarType()
|
||||
&& (Type.getNumericTypes().contains((ScalarType) v.getActualScalarType(v.getType()))
|
||||
|| v.getType() == Type.BOOLEAN)) {
|
||||
list.add(v.getStringValueInFe());
|
||||
} else {
|
||||
list.add(v.getStringValueForArray());
|
||||
}
|
||||
});
|
||||
return "[" + StringUtils.join(list, ", ") + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void toThrift(TExprNode msg) {
|
||||
msg.node_type = TExprNodeType.ARRAY_LITERAL;
|
||||
|
||||
@ -246,6 +246,11 @@ public class DecimalLiteral extends LiteralExpr {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getStringValueInFe() {
|
||||
return value.toPlainString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toSqlImpl() {
|
||||
return getStringValue();
|
||||
|
||||
@ -2224,6 +2224,10 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl
|
||||
return "";
|
||||
}
|
||||
|
||||
public String getStringValueInFe() {
|
||||
return getStringValue();
|
||||
}
|
||||
|
||||
// A special method only for array literal, all primitive type in array
|
||||
// will be wrapped by double quote. eg:
|
||||
// ["1", "2", "3"]
|
||||
|
||||
@ -140,9 +140,26 @@ public class FloatLiteral extends LiteralExpr {
|
||||
return nf.format(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getStringValueInFe() {
|
||||
if (type == Type.TIME || type == Type.TIMEV2) {
|
||||
// FloatLiteral used to represent TIME type, here we need to remove apostrophe from timeStr
|
||||
// for example '11:22:33' -> 11:22:33
|
||||
String timeStr = getStringValue();
|
||||
return timeStr.substring(1, timeStr.length() - 1);
|
||||
} else {
|
||||
return BigDecimal.valueOf(getValue()).toPlainString();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getStringValueForArray() {
|
||||
return "\"" + getStringValue() + "\"";
|
||||
String ret = getStringValue();
|
||||
if (type == Type.TIME || type == Type.TIMEV2) {
|
||||
// here already wrapped in ''
|
||||
ret = ret.substring(1, ret.length() - 1);
|
||||
}
|
||||
return "\"" + ret + "\"";
|
||||
}
|
||||
|
||||
public static Type getDefaultTimeType(Type type) throws AnalysisException {
|
||||
|
||||
@ -234,6 +234,10 @@ public abstract class LiteralExpr extends Expr implements Comparable<LiteralExpr
|
||||
@Override
|
||||
public abstract String getStringValue();
|
||||
|
||||
public String getStringValueInFe() {
|
||||
return getStringValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract String getStringValueForArray();
|
||||
|
||||
|
||||
@ -101,6 +101,11 @@ public class NullLiteral extends LiteralExpr {
|
||||
return "NULL";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getStringValueInFe() {
|
||||
return null;
|
||||
}
|
||||
|
||||
// the null value inside an array is represented as "null", for exampe:
|
||||
// [null, null]. Not same as other primitive type to represent as \N.
|
||||
@Override
|
||||
|
||||
@ -465,7 +465,7 @@ public class NereidsPlanner extends Planner {
|
||||
if (expr instanceof Literal) {
|
||||
LiteralExpr legacyExpr = ((Literal) expr).toLegacyLiteral();
|
||||
columns.add(new Column(output.getName(), output.getDataType().toCatalogDataType()));
|
||||
super.handleLiteralInFe(legacyExpr, data);
|
||||
data.add(legacyExpr.getStringValueInFe());
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@ -670,7 +670,7 @@ public class OriginalPlanner extends Planner {
|
||||
String columnName = columnLabels.get(i);
|
||||
if (expr instanceof LiteralExpr) {
|
||||
columns.add(new Column(columnName, expr.getType()));
|
||||
super.handleLiteralInFe((LiteralExpr) expr, data);
|
||||
data.add(((LiteralExpr) expr).getStringValueInFe());
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@ -17,18 +17,12 @@
|
||||
|
||||
package org.apache.doris.planner;
|
||||
|
||||
import org.apache.doris.analysis.ArrayLiteral;
|
||||
import org.apache.doris.analysis.DecimalLiteral;
|
||||
import org.apache.doris.analysis.DescriptorTable;
|
||||
import org.apache.doris.analysis.ExplainOptions;
|
||||
import org.apache.doris.analysis.FloatLiteral;
|
||||
import org.apache.doris.analysis.LiteralExpr;
|
||||
import org.apache.doris.analysis.NullLiteral;
|
||||
import org.apache.doris.analysis.StatementBase;
|
||||
import org.apache.doris.common.UserException;
|
||||
import org.apache.doris.common.profile.PlanTreeBuilder;
|
||||
import org.apache.doris.common.profile.PlanTreePrinter;
|
||||
import org.apache.doris.common.util.LiteralUtils;
|
||||
import org.apache.doris.qe.ResultSet;
|
||||
import org.apache.doris.thrift.TQueryOptions;
|
||||
|
||||
@ -111,20 +105,6 @@ public abstract class Planner {
|
||||
return planNodeMap;
|
||||
}
|
||||
|
||||
protected void handleLiteralInFe(LiteralExpr literalExpr, List<String> data) {
|
||||
if (literalExpr instanceof NullLiteral) {
|
||||
data.add(null);
|
||||
} else if (literalExpr instanceof FloatLiteral) {
|
||||
data.add(LiteralUtils.getStringValue((FloatLiteral) literalExpr));
|
||||
} else if (literalExpr instanceof DecimalLiteral) {
|
||||
data.add(((DecimalLiteral) literalExpr).getValue().toPlainString());
|
||||
} else if (literalExpr instanceof ArrayLiteral) {
|
||||
data.add(LiteralUtils.getStringValue((ArrayLiteral) literalExpr));
|
||||
} else {
|
||||
data.add(literalExpr.getStringValue());
|
||||
}
|
||||
}
|
||||
|
||||
public void appendTupleInfo(StringBuilder stringBuilder) {}
|
||||
|
||||
public void appendHintInfo(StringBuilder stringBuilder) {}
|
||||
|
||||
Reference in New Issue
Block a user