[FIX](array )fix array<null> literal in fe (#27750)

This commit is contained in:
amory
2023-12-03 13:19:22 +08:00
committed by GitHub
parent 43f2966889
commit 3ddc8211d1
18 changed files with 206 additions and 27 deletions

View File

@ -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;

View File

@ -246,6 +246,11 @@ public class DecimalLiteral extends LiteralExpr {
}
}
@Override
public String getStringValueInFe() {
return value.toPlainString();
}
@Override
public String toSqlImpl() {
return getStringValue();

View File

@ -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"]

View File

@ -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 {

View File

@ -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();

View File

@ -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

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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) {}