IMPALA-5529: Add additional function signatures for TRUNC() The following signatures to be added: +--------------+----------------------------------+-------------+---------------+ | return type | signature | binary type | is persistent | +--------------+----------------------------------+-------------+---------------+ | DECIMAL(*,*) | trunc(DECIMAL(*,*)) | BUILTIN | true | | DECIMAL(*,*) | trunc(DECIMAL(*,*), BIGINT) | BUILTIN | true | | DECIMAL(*,*) | trunc(DECIMAL(*,*), INT) | BUILTIN | true | | DECIMAL(*,*) | trunc(DECIMAL(*,*), SMALLINT) | BUILTIN | true | | DECIMAL(*,*) | trunc(DECIMAL(*,*), TINYINT) | BUILTIN | true | | BIGINT | trunc(DOUBLE) | BUILTIN | true | +--------------+----------------------------------+-------------+---------------+
Tests: * Adds tests for the new builtin trunc()/dtrunc() Change-Id: I856da9f817b948de3c72af60a0742b128398b4cf Reviewed-on: http://gerrit.cloudera.org:8080/7450 Tested-by: Impala Public Jenkins Reviewed-by: Matthew Jacobs <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/15e6cf8f Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/15e6cf8f Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/15e6cf8f Branch: refs/heads/master Commit: 15e6cf8fd03e3ae012435592f0bf4d6a64298099 Parents: c881426 Author: Jinchul <[email protected]> Authored: Tue Jul 18 23:39:08 2017 +0900 Committer: Matthew Jacobs <[email protected]> Committed: Sat Jul 29 20:53:45 2017 +0000 ---------------------------------------------------------------------- common/function-registry/impala_functions.py | 12 +++--- .../impala/analysis/FunctionCallExpr.java | 1 + .../impala/analysis/AnalyzeExprsTest.java | 42 ++++++++++++++------ 3 files changed, 36 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/15e6cf8f/common/function-registry/impala_functions.py ---------------------------------------------------------------------- diff --git a/common/function-registry/impala_functions.py b/common/function-registry/impala_functions.py index 1502809..f43c7c1 100644 --- a/common/function-registry/impala_functions.py +++ b/common/function-registry/impala_functions.py @@ -275,7 +275,7 @@ visible_functions = [ [['degrees'], 'DOUBLE', ['DOUBLE'], 'impala::MathFunctions::Degrees'], [['ceil', 'ceiling', 'dceil'], 'BIGINT', ['DOUBLE'], 'impala::MathFunctions::Ceil'], [['floor', 'dfloor'], 'BIGINT', ['DOUBLE'], 'impala::MathFunctions::Floor'], - [['truncate','dtrunc'], 'BIGINT', ['DOUBLE'], 'impala::MathFunctions::Truncate'], + [['truncate','dtrunc','trunc'], 'BIGINT', ['DOUBLE'], 'impala::MathFunctions::Truncate'], [['round','dround'], 'BIGINT', ['DOUBLE'], 'impala::MathFunctions::Round'], [['round','dround'], 'DOUBLE', ['DOUBLE', 'INT'], 'impala::MathFunctions::RoundUpTo'], [['exp', 'dexp'], 'DOUBLE', ['DOUBLE'], 'impala::MathFunctions::Exp'], @@ -396,14 +396,14 @@ visible_functions = [ [['round','dround'], 'DECIMAL', ['DECIMAL', 'SMALLINT'], 'impala::DecimalFunctions::RoundTo'], [['round','dround'], 'DECIMAL', ['DECIMAL', 'INT'], 'impala::DecimalFunctions::RoundTo'], [['round','dround'], 'DECIMAL', ['DECIMAL', 'BIGINT'], 'impala::DecimalFunctions::RoundTo'], - [['truncate','dtrunc'], 'DECIMAL', ['DECIMAL'], 'impala::DecimalFunctions::Truncate'], - [['truncate','dtrunc'], 'DECIMAL', ['DECIMAL', 'TINYINT'], + [['truncate','dtrunc','trunc'], 'DECIMAL', ['DECIMAL'], 'impala::DecimalFunctions::Truncate'], + [['truncate','dtrunc','trunc'], 'DECIMAL', ['DECIMAL', 'TINYINT'], 'impala::DecimalFunctions::TruncateTo'], - [['truncate','dtrunc'], 'DECIMAL', ['DECIMAL', 'SMALLINT'], + [['truncate','dtrunc','trunc'], 'DECIMAL', ['DECIMAL', 'SMALLINT'], 'impala::DecimalFunctions::TruncateTo'], - [['truncate','dtrunc'], 'DECIMAL', ['DECIMAL', 'INT'], + [['truncate','dtrunc','trunc'], 'DECIMAL', ['DECIMAL', 'INT'], 'impala::DecimalFunctions::TruncateTo'], - [['truncate','dtrunc'], 'DECIMAL', ['DECIMAL', 'BIGINT'], + [['truncate','dtrunc','trunc'], 'DECIMAL', ['DECIMAL', 'BIGINT'], 'impala::DecimalFunctions::TruncateTo'], # String builtin functions http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/15e6cf8f/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java ---------------------------------------------------------------------- diff --git a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java index 20add13..9364f12 100644 --- a/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java +++ b/fe/src/main/java/org/apache/impala/analysis/FunctionCallExpr.java @@ -394,6 +394,7 @@ public class FunctionCallExpr extends Expr { digitsAfter = 0; } else if (fnName_.getFunction().equalsIgnoreCase("truncate") || fnName_.getFunction().equalsIgnoreCase("dtrunc") || + fnName_.getFunction().equalsIgnoreCase("trunc") || fnName_.getFunction().equalsIgnoreCase("round") || fnName_.getFunction().equalsIgnoreCase("dround")) { if (children_.size() > 1) { http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/15e6cf8f/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java ---------------------------------------------------------------------- diff --git a/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java b/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java index 6f883a3..5d843bf 100644 --- a/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java +++ b/fe/src/test/java/org/apache/impala/analysis/AnalyzeExprsTest.java @@ -2193,6 +2193,7 @@ public class AnalyzeExprsTest extends AnalyzerTest { @Test public void TestDecimalFunctions() throws AnalysisException { + final String [] aliasesOfTruncate = new String[]{"truncate", "dtrunc", "trunc"}; AnalyzesOk("select abs(cast(1 as decimal))"); AnalyzesOk("select abs(cast(-1.1 as decimal(10,3)))"); @@ -2205,18 +2206,25 @@ public class AnalyzeExprsTest extends AnalyzerTest { AnalyzesOk("select round(cast(1.123 as decimal(10,3)), 5)"); AnalyzesOk("select round(cast(1.123 as decimal(10,3)), -2)"); - AnalyzesOk("select truncate(cast(1.123 as decimal(10,3)))"); - AnalyzesOk("select truncate(cast(1.123 as decimal(10,3)), 0)"); - AnalyzesOk("select truncate(cast(1.123 as decimal(10,3)), 2)"); - AnalyzesOk("select truncate(cast(1.123 as decimal(10,3)), 5)"); - AnalyzesOk("select truncate(cast(1.123 as decimal(10,3)), -1)"); + for (final String alias : aliasesOfTruncate) { + AnalyzesOk(String.format("select %s(cast(1.123 as decimal(10,3)))", alias)); + AnalyzesOk(String.format("select %s(cast(1.123 as decimal(10,3)), 0)", alias)); + AnalyzesOk(String.format("select %s(cast(1.123 as decimal(10,3)), 2)", alias)); + AnalyzesOk(String.format("select %s(cast(1.123 as decimal(10,3)), 5)", alias)); + AnalyzesOk(String.format("select %s(cast(1.123 as decimal(10,3)), -1)", alias)); + } AnalysisError("select round(cast(1.123 as decimal(10,3)), 5.1)", "No matching function with signature: round(DECIMAL(10,3), DECIMAL(2,1))"); AnalysisError("select round(cast(1.123 as decimal(30,20)), 40)", "Cannot round/truncate to scales greater than 38."); - AnalysisError("select truncate(cast(1.123 as decimal(10,3)), 40)", - "Cannot round/truncate to scales greater than 38."); + for (final String alias : aliasesOfTruncate) { + AnalysisError(String.format("select truncate(cast(1.123 as decimal(10,3)), 40)", + alias), "Cannot round/truncate to scales greater than 38."); + AnalyzesOk(String.format("select %s(NULL)", alias)); + AnalysisError(String.format("select %s(NULL, 1)", alias), + "Cannot resolve DECIMAL precision and scale from NULL type."); + } AnalysisError("select round(cast(1.123 as decimal(10,3)), NULL)", "round() cannot be called with a NULL second argument."); @@ -2244,12 +2252,20 @@ public class AnalyzeExprsTest extends AnalyzerTest { testDecimalExpr("ceil(123.45)", ScalarType.createDecimalType(4, 0)); testDecimalExpr("floor(12.345)", ScalarType.createDecimalType(3, 0)); - testDecimalExpr("truncate(1.23)", ScalarType.createDecimalType(1, 0)); - testDecimalExpr("truncate(1.23, 1)", ScalarType.createDecimalType(2, 1)); - testDecimalExpr("truncate(1.23, 0)", ScalarType.createDecimalType(1, 0)); - testDecimalExpr("truncate(1.23, 3)", ScalarType.createDecimalType(4, 3)); - testDecimalExpr("truncate(1.23, -1)", ScalarType.createDecimalType(1, 0)); - testDecimalExpr("truncate(1.23, -2)", ScalarType.createDecimalType(1, 0)); + for (final String alias : aliasesOfTruncate) { + testDecimalExpr(String.format("%s(1.23)", alias), + ScalarType.createDecimalType(1, 0)); + testDecimalExpr(String.format("%s(1.23, 1)", alias), + ScalarType.createDecimalType(2, 1)); + testDecimalExpr(String.format("%s(1.23, 0)", alias), + ScalarType.createDecimalType(1, 0)); + testDecimalExpr(String.format("%s(1.23, 3)", alias), + ScalarType.createDecimalType(4, 3)); + testDecimalExpr(String.format("%s(1.23, -1)", alias), + ScalarType.createDecimalType(1, 0)); + testDecimalExpr(String.format("%s(1.23, -2)", alias), + ScalarType.createDecimalType(1, 0)); + } } /**
