Taras Bobrovytsky has uploaded a new patch set (#5). Change subject: IMPALA-4939, IMPALA-4940: Decimal V2 multiplication ......................................................................
IMPALA-4939, IMPALA-4940: Decimal V2 multiplication Implement the new DECIMAL return type rules for multiply expressions, active when query option DECIMAL_V2=1. The algorithm for determining the type of the result of multiplication is described in the JIRA. DECIMAL V1: +-----------------------------------------------------------------------+ | typeof(cast('0.1' as decimal(38,38)) * cast('0.1' as decimal(38,38))) | +-----------------------------------------------------------------------+ | DECIMAL(38,38) | +-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+ | typeof(cast('0.1' as decimal(38,15)) * cast('0.1' as decimal(38,15))) | +-----------------------------------------------------------------------+ | DECIMAL(38,30) | +-----------------------------------------------------------------------+ DECIMAL V2: +-----------------------------------------------------------------------+ | typeof(cast('0.1' as decimal(38,38)) * cast('0.1' as decimal(38,38))) | +-----------------------------------------------------------------------+ | DECIMAL(38,37) | +-----------------------------------------------------------------------+ +-----------------------------------------------------------------------+ | typeof(cast('0.1' as decimal(38,15)) * cast('0.1' as decimal(38,15))) | +-----------------------------------------------------------------------+ | DECIMAL(38,6) | +-----------------------------------------------------------------------+ In this patch, we also fix the early multiplication overflow. We compute an int256 intermediate value, which we then attempt to scale down and round to int128. Benchmarks: In the following benchmarks, we are selecting from lineitem_big, which has about 100 times as many rows as the normal lineitem. Query: select sum(l_quantity * l_tax) + sum(l_extendedprice * l_discount) from lineitem_big; Before: DECIMAL_V2 disabled: 2.24s DECIMAL_V2 enabled : 2.14 After: DECIMAL_V2 disabled: 2.66s DECIMAL_V2 enabled : 2.25s Query: select sum(l_quantity * l_tax * cast(1 as decimal(38, 0))) + sum(l_extendedprice * l_discount * cast(1 as decimal(38, 0))) from lineitem_big Before: DECIMAL_V2 disabled: 2.34s DECIMAL_V2 enabled : 2.36s After: DECIMAL_V2 disabled: 4.25s DECIMAL_V2 enabled : 4.15s Query: select sum(l_quantity * l_tax * cast(1 as decimal(38, 37))) + sum(l_extendedprice * l_discount * cast(1 as decimal(38, 37))) from lineitem_big Before: DECIMAL_V2 disabled: 2.84s DECIMAL_V2 enabled : 8.26s After: DECIMAL_V2 disabled: 69.16s DECIMAL_V2 enabled : 66.13s Change-Id: I37ad6232d7953bd75c18dc86e665b2b501a1ebe1 --- M be/src/exprs/expr-test.cc M be/src/runtime/decimal-value.inline.h M be/src/util/bit-util.h M fe/src/main/java/org/apache/impala/analysis/TypesUtil.java 4 files changed, 282 insertions(+), 60 deletions(-) git pull ssh://gerrit.cloudera.org:29418/Impala-ASF refs/changes/38/7438/5 -- To view, visit http://gerrit.cloudera.org:8080/7438 To unsubscribe, visit http://gerrit.cloudera.org:8080/settings Gerrit-MessageType: newpatchset Gerrit-Change-Id: I37ad6232d7953bd75c18dc86e665b2b501a1ebe1 Gerrit-PatchSet: 5 Gerrit-Project: Impala-ASF Gerrit-Branch: master Gerrit-Owner: Taras Bobrovytsky <tbobrovyt...@cloudera.com> Gerrit-Reviewer: Dan Hecht <dhe...@cloudera.com> Gerrit-Reviewer: Michael Ho <k...@cloudera.com> Gerrit-Reviewer: Taras Bobrovytsky <tbobrovyt...@cloudera.com> Gerrit-Reviewer: Tim Armstrong <tarmstr...@cloudera.com> Gerrit-Reviewer: Zach Amsden <zams...@cloudera.com>