git commit: PHOENIX-1206 Decimal serialization broken for negative numbers with more than 19 digits of precision (Kyle Buzsaki)
Repository: phoenix Updated Branches: refs/heads/master 29c610cfd - e8c2664e7 PHOENIX-1206 Decimal serialization broken for negative numbers with more than 19 digits of precision (Kyle Buzsaki) Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/e8c2664e Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/e8c2664e Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/e8c2664e Branch: refs/heads/master Commit: e8c2664e7705901991114278d182b65c2fb57c00 Parents: 29c610c Author: James Taylor jamestay...@apache.org Authored: Wed Aug 27 18:18:12 2014 -0700 Committer: James Taylor jamestay...@apache.org Committed: Wed Aug 27 18:18:12 2014 -0700 -- .../org/apache/phoenix/schema/PDataType.java| 4 +-- .../org/apache/phoenix/util/NumberUtil.java | 2 +- .../RoundFloorCeilExpressionsTest.java | 31 .../apache/phoenix/schema/PDataTypeTest.java| 22 ++ 4 files changed, 43 insertions(+), 16 deletions(-) -- http://git-wip-us.apache.org/repos/asf/phoenix/blob/e8c2664e/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java -- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java index 714028c..3d38d64 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java @@ -6596,7 +6596,7 @@ public enum PDataType { } else { // Adjust length and offset down because we don't have enough room length = MAX_BIG_DECIMAL_BYTES; -index = offset + length - 1; +index = offset + length; } } BigInteger bi = v.unscaledValue(); @@ -6605,7 +6605,7 @@ public enum PDataType { BigInteger[] dandr = bi.divideAndRemainder(divideBy); bi = dandr[0]; int digit = dandr[1].intValue(); -result[--index] = (byte)(signum * digit * multiplyBy + digitOffset); +result[--index] = (byte)(digit * multiplyBy + digitOffset); multiplyBy = 1; divideBy = ONE_HUNDRED; } http://git-wip-us.apache.org/repos/asf/phoenix/blob/e8c2664e/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java -- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java index 1943b6b..7889a89 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java @@ -37,7 +37,7 @@ public class NumberUtil { * @return new {@link BigDecimal} instance */ public static BigDecimal normalize(BigDecimal bigDecimal) { -return bigDecimal.stripTrailingZeros().round(PDataType.DEFAULT_MATH_CONTEXT); +return bigDecimal.round(PDataType.DEFAULT_MATH_CONTEXT).stripTrailingZeros(); } public static BigDecimal setDecimalWidthAndScale(BigDecimal decimal, Integer precisionOrNull, Integer scaleOrNull) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/e8c2664e/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java -- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java b/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java index 25520c4..4757e5b 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java @@ -327,19 +327,24 @@ public class RoundFloorCeilExpressionsTest { // value doesn't matter because we only use those expressions to produce a keypart private static final LiteralExpression DUMMY_DECIMAL = LiteralExpression.newConstant(new BigDecimal(2.5)); -// this should be PDataType#MAX_PRECISION (38) -// but there are rounding errors in DECIMAL.toBytes() and DECIMAL.toObject() -// with precisions of 20 or greater. See https://issues.apache.org/jira/browse/PHOENIX-1206 -private static final int MAX_RELIABLE_PRECISION = 18; - -// once PHOENIX-1206 is fixed, we should add more precise decimals to these tests private static final ListBigDecimal DECIMALS = Collections.unmodifiableList( Arrays.asList( -new BigDecimal(-200300), new BigDecimal(-8.44), new
git commit: PHOENIX-1206 Decimal serialization broken for negative numbers with more than 19 digits of precision (Kyle Buzsaki)
Repository: phoenix Updated Branches: refs/heads/3.0 c58532283 - 3f853bd71 PHOENIX-1206 Decimal serialization broken for negative numbers with more than 19 digits of precision (Kyle Buzsaki) Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/3f853bd7 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/3f853bd7 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/3f853bd7 Branch: refs/heads/3.0 Commit: 3f853bd7129c01955e3083aeafefc372431672a2 Parents: c585322 Author: James Taylor jamestay...@apache.org Authored: Wed Aug 27 18:23:17 2014 -0700 Committer: James Taylor jamestay...@apache.org Committed: Wed Aug 27 18:23:17 2014 -0700 -- .../org/apache/phoenix/schema/PDataType.java| 4 +-- .../org/apache/phoenix/util/NumberUtil.java | 2 +- .../RoundFloorCeilExpressionsTest.java | 31 .../apache/phoenix/schema/PDataTypeTest.java| 22 ++ 4 files changed, 43 insertions(+), 16 deletions(-) -- http://git-wip-us.apache.org/repos/asf/phoenix/blob/3f853bd7/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java -- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java index 714028c..3d38d64 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PDataType.java @@ -6596,7 +6596,7 @@ public enum PDataType { } else { // Adjust length and offset down because we don't have enough room length = MAX_BIG_DECIMAL_BYTES; -index = offset + length - 1; +index = offset + length; } } BigInteger bi = v.unscaledValue(); @@ -6605,7 +6605,7 @@ public enum PDataType { BigInteger[] dandr = bi.divideAndRemainder(divideBy); bi = dandr[0]; int digit = dandr[1].intValue(); -result[--index] = (byte)(signum * digit * multiplyBy + digitOffset); +result[--index] = (byte)(digit * multiplyBy + digitOffset); multiplyBy = 1; divideBy = ONE_HUNDRED; } http://git-wip-us.apache.org/repos/asf/phoenix/blob/3f853bd7/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java -- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java index 1943b6b..7889a89 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/NumberUtil.java @@ -37,7 +37,7 @@ public class NumberUtil { * @return new {@link BigDecimal} instance */ public static BigDecimal normalize(BigDecimal bigDecimal) { -return bigDecimal.stripTrailingZeros().round(PDataType.DEFAULT_MATH_CONTEXT); +return bigDecimal.round(PDataType.DEFAULT_MATH_CONTEXT).stripTrailingZeros(); } public static BigDecimal setDecimalWidthAndScale(BigDecimal decimal, Integer precisionOrNull, Integer scaleOrNull) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/3f853bd7/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java -- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java b/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java index 25520c4..4757e5b 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/expression/RoundFloorCeilExpressionsTest.java @@ -327,19 +327,24 @@ public class RoundFloorCeilExpressionsTest { // value doesn't matter because we only use those expressions to produce a keypart private static final LiteralExpression DUMMY_DECIMAL = LiteralExpression.newConstant(new BigDecimal(2.5)); -// this should be PDataType#MAX_PRECISION (38) -// but there are rounding errors in DECIMAL.toBytes() and DECIMAL.toObject() -// with precisions of 20 or greater. See https://issues.apache.org/jira/browse/PHOENIX-1206 -private static final int MAX_RELIABLE_PRECISION = 18; - -// once PHOENIX-1206 is fixed, we should add more precise decimals to these tests private static final ListBigDecimal DECIMALS = Collections.unmodifiableList( Arrays.asList( -new BigDecimal(-200300), new BigDecimal(-8.44), new