-
Notifications
You must be signed in to change notification settings - Fork 174
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: skip negative scale checks for creating decimals #723
Changes from 3 commits
d8f2946
d00e05c
d0b8ec8
027f9b8
2230c66
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -73,9 +73,9 @@ public boolean isFixedLength() { | |
@Override | ||
public Decimal getDecimal(int i, int precision, int scale) { | ||
if (!useDecimal128 && precision <= Decimal.MAX_INT_DIGITS() && type instanceof IntegerType) { | ||
return Decimal.createUnsafe(getInt(i), precision, scale); | ||
return createDecimal(getInt(i), precision, scale); | ||
} else if (!useDecimal128 && precision <= Decimal.MAX_LONG_DIGITS()) { | ||
return Decimal.createUnsafe(getLong(i), precision, scale); | ||
return createDecimal(getLong(i), precision, scale); | ||
} else { | ||
byte[] bytes = getBinaryDecimal(i); | ||
BigInteger bigInteger = new BigInteger(bytes); | ||
|
@@ -98,6 +98,15 @@ public Decimal getDecimal(int i, int precision, int scale) { | |
} | ||
} | ||
|
||
/** This method skips the negative scale check, otherwise the same as Decimal.createUnsafe. */ | ||
private Decimal createDecimal(long unscaled, int precision, int scale) { | ||
Decimal dec = new Decimal(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Seems the check for negative scale is a feature for ANSI correctness? https://issues.apache.org/jira/browse/SPARK-30252 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It does not need to do the check every read, we are running ANSI tests in spark_sql_test_ansi.yml |
||
dec.org$apache$spark$sql$types$Decimal$$longVal_$eq(unscaled); | ||
dec.org$apache$spark$sql$types$Decimal$$_precision_$eq(precision); | ||
dec.org$apache$spark$sql$types$Decimal$$_scale_$eq(scale); | ||
return dec; | ||
} | ||
|
||
/** | ||
* Reads a 16-byte byte array which are encoded big-endian for decimal128 into internal byte | ||
* array. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is not directly related but forgot to add based on #705 (comment)