📄 sqllongint.java
字号:
} /* ** SQL Operators */ /** * The = operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the = * @param right The value on the right side of the = * * @return A SQL boolean value telling whether the two parameters are equal * * @exception StandardException Thrown on error */ public BooleanDataValue equals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getLong() == right.getLong()); } /** * The <> operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the <> * @param right The value on the right side of the <> * * @return A SQL boolean value telling whether the two parameters * are not equal * * @exception StandardException Thrown on error */ public BooleanDataValue notEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getLong() != right.getLong()); } /** * The < operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the < * @param right The value on the right side of the < * * @return A SQL boolean value telling whether the first operand is less * than the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue lessThan(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getLong() < right.getLong()); } /** * The > operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the > * @param right The value on the right side of the > * * @return A SQL boolean value telling whether the first operand is greater * than the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue greaterThan(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getLong() > right.getLong()); } /** * The <= operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the <= * @param right The value on the right side of the <= * * @return A SQL boolean value telling whether the first operand is less * than or equal to the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue lessOrEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getLong() <= right.getLong()); } /** * The >= operator as called from the language module, as opposed to * the storage module. * * @param left The value on the left side of the >= * @param right The value on the right side of the >= * * @return A SQL boolean value telling whether the first operand is greater * than or equal to the second operand * * @exception StandardException Thrown on error */ public BooleanDataValue greaterOrEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException { return SQLBoolean.truthValue(left, right, left.getLong() >= right.getLong()); } /** * This method implements the + operator for "bigint + bigint". * * @param addend1 One of the addends * @param addend2 The other addend * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLLongint containing the result of the addition * * @exception StandardException Thrown on error */ public NumberDataValue plus(NumberDataValue addend1, NumberDataValue addend2, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLLongint(); } if (addend1.isNull() || addend2.isNull()) { result.setToNull(); return result; } long addend1Long = addend1.getLong(); long addend2Long = addend2.getLong(); long resultValue = addend1Long + addend2Long; /* ** Java does not check for overflow with integral types. We have to ** check the result ourselves. ** ** Overflow is possible only if the two addends have the same sign. ** Do they? (This method of checking is approved by "The Java ** Programming Language" by Arnold and Gosling.) */ if ((addend1Long < 0) == (addend2Long < 0)) { /* ** Addends have the same sign. The result should have the same ** sign as the addends. If not, an overflow has occurred. */ if ((addend1Long < 0) != (resultValue < 0)) { throw StandardException.newException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE, "BIGINT"); } } result.setValue(resultValue); return result; } /** * This method implements the - operator for "bigint - bigint". * * @param left The value to be subtracted from * @param right The value to be subtracted * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLLongint containing the result of the subtraction * * @exception StandardException Thrown on error */ public NumberDataValue minus(NumberDataValue left, NumberDataValue right, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLLongint(); } if (left.isNull() || right.isNull()) { result.setToNull(); return result; } long diff = left.getLong() - right.getLong(); /* ** Java does not check for overflow with integral types. We have to ** check the result ourselves. ** ** Overflow is possible only if the left and the right side have opposite signs. ** Do they? (This method of checking is approved by "The Java ** Programming Language" by Arnold and Gosling.) */ if ((left.getLong() < 0) != (right.getLong() < 0)) { /* ** Left and right have opposite signs. The result should have the same ** sign as the left (this). If not, an overflow has occurred. */ if ((left.getLong() < 0) != (diff < 0)) { throw StandardException.newException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE, "BIGINT"); } } result.setValue(diff); return result; } /** * This method implements the * operator for "bigint * bigint". * * @param left The first value to be multiplied * @param right The second value to be multiplied * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLLongint containing the result of the multiplication * * @exception StandardException Thrown on error */ public NumberDataValue times(NumberDataValue left, NumberDataValue right, NumberDataValue result) throws StandardException { long tempResult; if (result == null) { result = new SQLLongint(); } if (left.isNull() || right.isNull()) { result.setToNull(); return result; } /* ** Java does not check for overflow with integral types. We have to ** check the result ourselves. ** ** We can't use sign checking tricks like we do for '+' and '-' since ** the product of 2 integers can wrap around multiple times. So, we ** apply the principle that a * b = c => a = c / b. If b != 0 and ** a != c / b, then overflow occurred. */ tempResult = left.getLong() * right.getLong(); if ((right.getLong() != 0) && (left.getLong() != tempResult / right.getLong())) { throw StandardException.newException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE, "BIGINT"); } result.setValue(tempResult); return result; } /** * This method implements the / operator for "bigint / bigint". * * @param dividend The numerator * @param divisor The denominator * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLLongint containing the result of the division * * @exception StandardException Thrown on error */ public NumberDataValue divide(NumberDataValue dividend, NumberDataValue divisor, NumberDataValue result) throws StandardException { long longDivisor; if (result == null) { result = new SQLLongint(); } if (dividend.isNull() || divisor.isNull()) { result.setToNull(); return result; } /* Catch divide by 0 */ longDivisor = divisor.getLong(); if (longDivisor == 0) { throw StandardException.newException(SQLState.LANG_DIVIDE_BY_ZERO); } result.setValue(dividend.getLong() / longDivisor); return result; } /** mod(bigint, bigint) */ public NumberDataValue mod(NumberDataValue dividend, NumberDataValue divisor, NumberDataValue result) throws StandardException { if (result == null) { result = new SQLLongint(); } if (dividend.isNull() || divisor.isNull()) { result.setToNull(); return result; } /* Catch divide by 0 */ long longDivisor = divisor.getLong(); if (longDivisor == 0) { throw StandardException.newException(SQLState.LANG_DIVIDE_BY_ZERO); } result.setValue(dividend.getLong() % longDivisor); return result; } /** * This method implements the unary minus operator for bigint. * * @param result The result of a previous call to this method, null * if not called yet * * @return A SQLLongint containing the result of the negation * * @exception StandardException Thrown on error */ public NumberDataValue minus(NumberDataValue result) throws StandardException { long operandValue; if (result == null) { result = new SQLLongint(); } if (this.isNull()) { result.setToNull(); return result; } operandValue = this.getLong(); /* ** In two's complement arithmetic, the minimum value for a number ** can't be negated, since there is no representation for its ** positive value. */ if (operandValue == Long.MIN_VALUE) { throw StandardException.newException(SQLState.LANG_OUTSIDE_RANGE_FOR_DATATYPE, "BIGINT"); } result.setValue(-operandValue); return result; } /** * This method implements the isNegative method. * * @return A boolean. if this.value is negative, return true. * * @exception StandException Thrown on error */ protected boolean isNegative() { return !isNull() && value < 0L; } /* * String display of value */ public String toString() { if (isNull()) return "NULL"; else return Long.toString(value); } /* * Hash code */ public int hashCode() { return (int) (value ^ (value >> 32)); } private static final int BASE_MEMORY_USAGE = ClassSize.estimateBaseFromCatalog( SQLLongint.class); public int estimateMemoryUsage() { return BASE_MEMORY_USAGE; } /* * object state */ private long value; private boolean isnull;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -