in kyuubi-hive-jdbc/src/main/java/org/apache/kyuubi/jdbc/hive/common/FastHiveDecimalImpl.java [7480:7589]
private static boolean doAddDifferentScale(
int leftSignum,
long leftFast0,
long leftFast1,
long leftFast2,
int leftIntegerDigitCount,
int leftScale,
int rightSignum,
long rightFast0,
long rightFast1,
long rightFast2,
int rightIntegerDigitCount,
int rightScale,
FastHiveDecimal fastResult) {
if (leftSignum == rightSignum) {
if (!fastAddDifferentScale(
leftFast0,
leftFast1,
leftFast2,
leftIntegerDigitCount,
leftScale,
rightFast0,
rightFast1,
rightFast2,
rightIntegerDigitCount,
rightScale,
fastResult)) {
return false;
}
// Sign stays the same.
fastResult.fastSignum = leftSignum;
} else {
// Just compare the magnitudes (i.e. signums set to 1).
int compareTo =
fastCompareTo(
1,
leftFast0,
leftFast1,
leftFast2,
leftScale,
1,
rightFast0,
rightFast1,
rightFast2,
rightScale);
if (compareTo == 0) {
// They cancel each other.
fastResult.fastSignum = 0;
fastResult.fast0 = 0;
fastResult.fast1 = 0;
fastResult.fast2 = 0;
fastResult.fastScale = 0;
return true;
}
if (compareTo == 1) {
if (!fastSubtractDifferentScale(
leftFast0,
leftFast1,
leftFast2,
leftIntegerDigitCount,
leftScale,
rightFast0,
rightFast1,
rightFast2,
rightIntegerDigitCount,
rightScale,
fastResult)) {
throw new RuntimeException("Unexpected overflow");
}
fastResult.fastSignum = leftSignum;
} else {
if (!fastSubtractDifferentScale(
rightFast0,
rightFast1,
rightFast2,
rightIntegerDigitCount,
rightScale,
leftFast0,
leftFast1,
leftFast2,
leftIntegerDigitCount,
leftScale,
fastResult)) {
throw new RuntimeException("Unexpected overflow");
}
fastResult.fastSignum = rightSignum;
}
}
final int resultTrailingZeroCount =
fastTrailingDecimalZeroCount(
fastResult.fast0,
fastResult.fast1,
fastResult.fast2,
fastResult.fastIntegerDigitCount,
fastResult.fastScale);
if (resultTrailingZeroCount > 0) {
doFastScaleDown(fastResult, resultTrailingZeroCount, fastResult);
if (fastResult.fastSignum == 0) {
fastResult.fastScale = 0;
} else {
fastResult.fastScale -= resultTrailingZeroCount;
}
}
return true;
}