Skip to content

Commit

Permalink
fix array<null> literal in fe
Browse files Browse the repository at this point in the history
  • Loading branch information
amorynan committed Nov 29, 2023
1 parent 2ea1e9d commit a078db2
Show file tree
Hide file tree
Showing 10 changed files with 68 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,13 @@ public String getStringValueForArray() {
return "[" + StringUtils.join(list, ", ") + "]";
}

@Override
public String getStringValueInFe() {
List<String> list = new ArrayList<>(getChildren().size());
getChildren().forEach(v -> list.add(v.getStringValueForArray()));
return "[" + StringUtils.join(list, ", ") + "]";
}

@Override
protected void toThrift(TExprNode msg) {
msg.node_type = TExprNodeType.ARRAY_LITERAL;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,11 @@ public int compareLiteral(LiteralExpr expr) {
}
}

@Override
public String getStringValueInFe() {
return value.toPlainString();
}

@Override
public String toSqlImpl() {
return getStringValue();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,18 @@ public String getStringValue() {
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() + "\"";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,10 @@ public int compareTo(LiteralExpr literalExpr) {
@Override
public abstract String getStringValue();

public String getStringValueInFe() {
return getStringValue();
}

@Override
public abstract String getStringValueForArray();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ public String getStringValue() {
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ public Optional<ResultSet> handleQueryInFe(StatementBase parsedStmt) {
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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -669,7 +669,7 @@ public Optional<ResultSet> handleQueryInFe(StatementBase parsedStmt) {
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();
}
Expand Down
20 changes: 0 additions & 20 deletions fe/fe-core/src/main/java/org/apache/doris/planner/Planner.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -111,20 +105,6 @@ public Map<Integer, String> getExplainStringMap() {
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) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,23 @@
["1970-01-01"]

-- !select --
[NULL]
[null]

-- !select_nereid --
["1970-01-01", "1970-01-01"]

-- !select_nereid --
["1970-01-01", "1970-01-01"]

-- !select_nereid --
["1970-01-01", "1970-01-01"]

-- !select_nereid --
[]

-- !select_nereid --
["1970-01-01"]

-- !select_nereid --
[null]

Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,24 @@
// under the License.

suite("test_if_cast") {
// test old planner
sql "set enable_nereids_planner=false"
qt_select """ select if(job_d is null, cast(array() as array<varchar(10)>), job_d) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select """ select if(job_d is null, cast(array(null) as array<varchar(10)>), job_d) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select """ select if(job_d is null, cast(array('1970-01-01') as array<varchar(10)>), job_d) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select """ select if(job_d is null, job_d, cast(array() as array<varchar(10)>)) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select """ select if(job_d is null, job_d, cast(array('1970-01-01') as array<varchar(10)>)) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select """ select if(job_d is null, job_d, cast(array(null) as array<varchar(10)>)) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """

// test new planner
sql "set enable_nereids_planner=true"
sql "set enable_fallback_to_original_planner = false"
qt_select_nereid """ select if(job_d is null, cast(array() as array<varchar(10)>), job_d) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select_nereid """ select if(job_d is null, cast(array(null) as array<varchar(10)>), job_d) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select_nereid """ select if(job_d is null, cast(array('1970-01-01') as array<varchar(10)>), job_d) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select_nereid """ select if(job_d is null, job_d, cast(array() as array<varchar(10)>)) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select_nereid """ select if(job_d is null, job_d, cast(array('1970-01-01') as array<varchar(10)>)) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """
qt_select_nereid """ select if(job_d is null, job_d, cast(array(null) as array<varchar(10)>)) as test from (select array('1970-01-01', '1970-01-01') as job_d) t; """


}

0 comments on commit a078db2

Please sign in to comment.