Zach Amsden has posted comments on this change.

Change subject: IMPALA-2020: Add rounding for decimal casts
......................................................................


Patch Set 5:

(6 comments)

http://gerrit.cloudera.org:8080/#/c/5951/5/be/src/exprs/decimal-operators-ir.cc
File be/src/exprs/decimal-operators-ir.cc:

PS5, Line 303: return to_type(dv.whole_part(scale)); 
> any reason not to have ToInt<>() handle this case too by passing in 'round'
Not really - I thought the saner behavior for ToInt was rounding and wrote this 
cast first, which didn't require a parameter, whereas FromDouble does as it is 
used in places where no context is available.  I can add this if you think it 
is useful.


http://gerrit.cloudera.org:8080/#/c/5951/5/be/src/exprs/literal.cc
File be/src/exprs/literal.cc:

Line 185:         value_.decimal4_val = Decimal4Value::FromDouble(type, v, 
&overflow, true);
> where is this used? will it break compatibility?
In what sense?


http://gerrit.cloudera.org:8080/#/c/5951/5/be/src/runtime/decimal-value.h
File be/src/runtime/decimal-value.h:

PS5, Line 54: bool* overflow,
            :       bool round
> here and below, let's keep input parameters first, then output params.
Done.  Means I can't give a default value to round unless I also give a default 
value to overflow, but lets do that anyway.

Is it okay if I change the ABI here to be

>From Double (const ColumnType& t, double d, bool round = true, bool& overflow 
>= of_ignored)

and then have a static bool DecimalValue::of_ignored which will get inserted 
when the caller doesn't bother to check overflow.  (Actually, Q: can reference 
arguments even have default values?)  The reason being to prevent a nullptr 
deref crash.  Worth having a debate about references vs. pointers here.  
Passing a pointer allows us to omit the overflow check from ever happening (ptr 
== nullptr should be known at compile time) but we currently don't do that or 
null checks in any of the places where we pass back this style of overflow.  I 
think we probably will want the overflow check in all runtime cases so maybe 
this doesn't matter.


Line 232:   inline typename RESULT_T::underlying_type_t ToInt(int scale, bool& 
overflow) const;
> add a function comment.
Done


PS5, Line 232:  bool& overflow
> use 'bool* overflow'. we generally use pointers for output params to make i
You have answered my last question.  Please ignore


http://gerrit.cloudera.org:8080/#/c/5951/5/be/src/runtime/decimal-value.inline.h
File be/src/runtime/decimal-value.inline.h:

Line 50:     if (abs(d) >= max_value) {
> is this correct? 'd' is already scaled here.  please be sure to test the up
Yeah that is bogus.  What we need is the maximum integer value that represents 
a base 10 number of length precision, so the -scale should go.


-- 
To view, visit http://gerrit.cloudera.org:8080/5951
To unsubscribe, visit http://gerrit.cloudera.org:8080/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I2daf186b4770a022f9cb349d512067a1dd624810
Gerrit-PatchSet: 5
Gerrit-Project: Impala-ASF
Gerrit-Branch: master
Gerrit-Owner: Zach Amsden <zams...@cloudera.com>
Gerrit-Reviewer: Dan Hecht <dhe...@cloudera.com>
Gerrit-Reviewer: Michael Ho
Gerrit-Reviewer: Zach Amsden <zams...@cloudera.com>
Gerrit-HasComments: Yes

Reply via email to