You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by dj...@apache.org on 2005/06/04 23:55:52 UTC
svn commit: r180029 - in
/incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types:
BigIntegerDecimal.java BinaryDecimal.java SQLDecimal.java
Author: djd
Date: Sat Jun 4 14:55:51 2005
New Revision: 180029
URL: http://svn.apache.org/viewcvs?rev=180029&view=rev
Log:
More updates to J2ME's DECIMAL implementation, fix the clone
method, implement toString and hashCode.
Modified:
incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BigIntegerDecimal.java
incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BinaryDecimal.java
incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/SQLDecimal.java
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BigIntegerDecimal.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BigIntegerDecimal.java?rev=180029&r1=180028&r2=180029&view=diff
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BigIntegerDecimal.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BigIntegerDecimal.java Sat Jun 4 14:55:51 2005
@@ -131,8 +131,32 @@
if (dot > ePosition)
throw invalidFormat();
+ // Integer.parseInt does not handle a + sign in
+ // front of the number, while the format for the
+ // exponent allows it. Need to strip it off.
+
+ int expOffset = ePosition + 1;
+
+ if (expOffset >= theValue.length())
+ throw invalidFormat();
+
+ if (theValue.charAt(expOffset) == '+')
+ {
+ // strip the plus but must ensure the next character
+ // is not a - sign. Any other invalid sign will be handled
+ // by Integer.parseInt.
+ expOffset++;
+ if (expOffset >= theValue.length())
+ throw invalidFormat();
+ if (theValue.charAt(expOffset) == '-')
+ throw invalidFormat();
+ }
+
+ String exponent = theValue.substring(expOffset);
+
+
// TODO Need to handle a + sign in the exponent
- scale = -1 * Integer.parseInt(theValue.substring(ePosition + 1));
+ scale = -1 * Integer.parseInt(exponent);
theValue = theValue.substring(0, ePosition);
}
@@ -157,8 +181,6 @@
data2c = bi.toByteArray();
sqlScale = scale;
- //System.out.println("setValue unscaled " + bi + "scale " + sqlScale);
-
} catch (NumberFormatException nfe)
{
throw invalidFormat();
@@ -176,8 +198,7 @@
// TODO - correct impl
String unscaled = new BigInteger(data2c).toString();
- //System.out.println("Scale" + sqlScale + " unv " + unscaled);
-
+
if (sqlScale == 0)
return unscaled;
@@ -217,13 +238,15 @@
if (this.isNegative())
precision--;
+ if (precision < sqlScale)
+ return sqlScale;
+
return precision;
}
/**
* Compare two non-null NumberDataValues using DECIMAL arithmetic.
- * Uses add() to perform the calculation.
*/
protected int typeCompare(DataValueDescriptor arg) throws StandardException {
@@ -232,7 +255,7 @@
// need to align scales to perform comparisions
int tscale = getDecimalValueScale();
int oscale = obid.getDecimalValueScale();
-
+
BigInteger tbi = new BigInteger(data2c);
BigInteger obi = new BigInteger(obid.data2c);
@@ -240,7 +263,7 @@
tbi = BigIntegerDecimal.rescale(tbi, oscale - tscale);
else if (oscale < tscale)
obi = BigIntegerDecimal.rescale(obi, tscale - oscale);
-
+
return tbi.compareTo(obi);
}
@@ -497,5 +520,15 @@
bi = bi.divide(BigIntegerDecimal.TEN);
}
return bi;
+ }
+ /*
+ * String display of value
+ */
+ public String toString()
+ {
+ if (isNull())
+ return "NULL";
+ else
+ return getString();
}
}
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BinaryDecimal.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BinaryDecimal.java?rev=180029&r1=180028&r2=180029&view=diff
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BinaryDecimal.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/BinaryDecimal.java Sat Jun 4 14:55:51 2005
@@ -662,8 +662,13 @@
public DataValueDescriptor getClone() {
BinaryDecimal dvd = (BinaryDecimal) getNewNull();
- dvd.data2c = this.data2c;
- dvd.sqlScale = this.sqlScale;
+ if (this.data2c != null)
+ {
+ dvd.data2c = new byte[data2c.length];
+ System.arraycopy(data2c, 0, dvd.data2c, 0, data2c.length);
+ dvd.sqlScale = sqlScale;
+ }
+
return dvd;
}
@@ -682,5 +687,18 @@
public int estimateMemoryUsage() {
// TODO Auto-generated method stub
return 0;
+ }
+
+ public int hashCode()
+ {
+ if (isNull())
+ return 0;
+
+ try {
+ return (int) Double.doubleToLongBits(getDouble());
+ } catch (StandardException se)
+ {
+ return 0;
+ }
}
}
Modified: incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/SQLDecimal.java
URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/SQLDecimal.java?rev=180029&r1=180028&r2=180029&view=diff
==============================================================================
--- incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/SQLDecimal.java (original)
+++ incubator/derby/code/trunk/java/engine/org/apache/derby/iapi/types/SQLDecimal.java Sat Jun 4 14:55:51 2005
@@ -561,7 +561,6 @@
protected int typeCompare(DataValueDescriptor arg) throws StandardException
{
BigDecimal otherValue = SQLDecimal.getBigDecimal(arg);
-
return getBigDecimal().compareTo(otherValue);
}
@@ -1008,7 +1007,7 @@
if (isNull())
return "NULL";
else
- return getBigDecimal().toString();
+ return getString();
}
/*