mirror of
https://github.com/apache/impala.git
synced 2025-12-19 18:12:08 -05:00
IMPALA-14405 ADDENDUM: Catch exception for bad column names
This commit is a fix on top of IMPALA-14405 for the Calcite planner. The original commit matches column names from the expression in the select clause. For instance, if the query is "select 1 + 1", the label in impala-shell will be "1 + 1". It accomplished this by retrieving the string from the SqlNode object through the MySql dialect. However, when the expression doesn't succeed in the MySql dialect, an AssertionError gets thrown, causing the query to fail. We don't want the query to fail, we just want to go back to using the Calcite expression, e.g. EXPR$0. This occurred with this specific query: "select timestamp_col + interval 3 nanoseconds" So now the exception is caught and the default label name is used. Eventually we should try to match what Impala has, but this is a harder problem to fix. Change-Id: I6c4d76a25fb2486eb1ef19485bce7888d45d282f Reviewed-on: http://gerrit.cloudera.org:8080/23665 Reviewed-by: Riza Suminto <riza.suminto@cloudera.com> Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com> Reviewed-by: Steve Carlin <scarlin@cloudera.com>
This commit is contained in:
@@ -177,12 +177,19 @@ public class CalciteRelNodeConverter implements CompilerStep {
|
||||
for (SqlNode selectItem : getSelectList(validatedNode)) {
|
||||
String fieldName = SqlValidatorUtil.alias(selectItem, 0);
|
||||
if (fieldName.startsWith("EXPR$")) {
|
||||
try {
|
||||
// If it's a Calcite generated field name, it will be of the form "EXPR$"
|
||||
// We get the actual SQL expression using the toSqlString method. There
|
||||
// is no Impala Dialect yet, so using MySql dialect to get the field
|
||||
// name. The language chosen is irrelevant because we only are using it
|
||||
// to grab the expression as/is to use for the label.
|
||||
fieldName = selectItem.toSqlString(MysqlSqlDialect.DEFAULT).getSql();
|
||||
} catch (Error e) {
|
||||
// The MysqlDialect may throw an exception if the column name is not
|
||||
// compatible with Mysql. So we catch the exception and just use the
|
||||
// EXPR$ column name.
|
||||
LOG.debug("Could not use label for {}, using default.", selectItem);
|
||||
}
|
||||
}
|
||||
fieldNamesBuilder.add(fieldName.toLowerCase());
|
||||
}
|
||||
|
||||
@@ -1122,6 +1122,14 @@ int
|
||||
row_regex: .*PlannerType: CalcitePlanner.*
|
||||
====
|
||||
---- QUERY
|
||||
# IMPALA-14561: Should not be using MySqlDialect to capture labels
|
||||
select timestamp_col + interval 3 milliseconds from functional.alltypestiny;
|
||||
---- LABELS
|
||||
expr$0
|
||||
---- RUNTIME_PROFILE
|
||||
row_regex: .*PlannerType: CalcitePlanner.*
|
||||
====
|
||||
---- QUERY
|
||||
select cast('nan' as double), cast('inf' as float);
|
||||
---- RESULTS
|
||||
NaN,Inf
|
||||
|
||||
Reference in New Issue
Block a user