commit 655bd35f8ebb66eefc8e39599a313313a474af51 Author: Tim Armstrong Date: Wed Nov 23 10:06:58 2016 -0800 WIP diff --git a/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java b/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java index f01a78c..3c0b850 100644 --- a/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java +++ b/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java @@ -91,12 +91,7 @@ public class ToSqlUtils { // are needed if this identifier will be preceded by a ".". boolean startsWithNumber = false; if (!hiveNeedsQuotes && !isImpalaKeyword) { - try { - Integer.parseInt(ident.substring(0, 1)); - startsWithNumber = true; - } catch (NumberFormatException e) { - // Ignore exception, identifier does not start with number. - } + startsWithNumber = Character.isDigit(ident.charAt(0)); } if (hiveNeedsQuotes || isImpalaKeyword || startsWithNumber) return "`" + ident + "`"; return ident; diff --git a/tests/query_test/test_exprs.py b/tests/query_test/test_exprs.py index 6c82df4..d054704 100644 --- a/tests/query_test/test_exprs.py +++ b/tests/query_test/test_exprs.py @@ -18,6 +18,7 @@ # Validates limit on scan nodes import pytest +from random import randint from tests.common.impala_test_suite import ImpalaTestSuite from tests.common.test_dimensions import create_exec_option_dimension @@ -119,6 +120,33 @@ class TestExprLimits(ImpalaTestSuite): cast_query = "select " + self.__gen_deep_func_expr("cast(", "1", " as int)") self.__exec_query(cast_query) + def test_huge_case(self): + """ Test that huge case statement can be codegen'd successfully. """ + # Make sure case isn't top-level expression - top-level CASE is not codegen'd + # because of IMPALA-4356. + case = self.__gen_huge_case("int_col", 50, 2, " ") + query = "select {0} = 42 as huge_case from functional_parquet.alltypes".format(case) + self.__exec_query(query) + + def __gen_huge_case(self, col_name, fanout, depth, indent): + toks = ["case\n"] + for i in xrange(fanout): + add = randint(1, 1000000) + divisor = randint(1, 10000000) + mod = randint(0, divisor) + # Generate a mathematical expr that can't be easily optimised out. + when_expr = "{0} + {1} % {2} = {3}".format(col_name, add, divisor, mod) + if depth == 0: + then_expr = "{0}".format(i) + else: + then_expr = "({0})".format( + self.__gen_huge_case(col_name, fanout, depth - 1, indent + " ")) + toks.append(indent) + toks.append("when {0} then {1}\n".format(when_expr, then_expr)) + toks.append(indent) + toks.append("end") + return ''.join(toks) + def __gen_deep_infix_expr(self, prefix, repeat_suffix): expr = prefix for i in xrange(self.EXPR_DEPTH_LIMIT - 1): @@ -140,3 +168,4 @@ class TestExprLimits(ImpalaTestSuite): assert impala_ret.success, "Failed to execute query %s" % (sql_str) except: # consider any exception a failure assert False, "Failed to execute query %s" % (sql_str) +