in HSQL/src/org/hsqldb1/Column.java [671:772]
static int compare(Collation collation, Object a, Object b, int type) {
int i = 0;
if (a == b) {
return 0;
}
// Current null handling here: null==null and smaller any value
// Note, standard SQL null handling is handled by Expression.test() calling testNull() instead of this!
// Attention, this is also used for grouping ('null' is one group)
if (a == null) {
return -1;
}
if (b == null) {
return 1;
}
switch (type) {
case Types.NULL :
return 0;
case Types.VARCHAR :
case Types.LONGVARCHAR :
return collation.compare((String) a, (String) b);
case Types.CHAR :
return collation.compare(Library.rtrim((String) a),
Library.rtrim((String) b));
case Types.VARCHAR_IGNORECASE :
return collation.compareIgnoreCase(((String) a), ((String) b));
case Types.TINYINT :
case Types.SMALLINT :
case Types.INTEGER : {
int ai = ((Number) a).intValue();
int bi = ((Number) b).intValue();
return (ai > bi) ? 1
: (bi > ai ? -1
: 0);
}
case Types.BIGINT : {
long longa = ((Number) a).longValue();
long longb = ((Number) b).longValue();
return (longa > longb) ? 1
: (longb > longa ? -1
: 0);
}
case Types.REAL :
case Types.FLOAT :
case Types.DOUBLE : {
double ad = ((Number) a).doubleValue();
double bd = ((Number) b).doubleValue();
return (ad > bd) ? 1
: (bd > ad ? -1
: 0);
}
case Types.NUMERIC :
case Types.DECIMAL :
i = ((BigDecimal) a).compareTo((BigDecimal) b);
break;
case Types.DATE :
return HsqlDateTime.compare((Date) a, (Date) b);
case Types.TIME :
return HsqlDateTime.compare((Time) a, (Time) b);
case Types.TIMESTAMP :
return HsqlDateTime.compare((Timestamp) a, (Timestamp) b);
case Types.BOOLEAN : {
boolean boola = ((Boolean) a).booleanValue();
boolean boolb = ((Boolean) b).booleanValue();
return (boola == boolb) ? 0
: (boolb ? -1
: 1);
}
case Types.BINARY :
case Types.VARBINARY :
case Types.LONGVARBINARY :
if (a instanceof Binary && b instanceof Binary) {
i = compareTo(((Binary) a).getBytes(),
((Binary) b).getBytes());
}
break;
case Types.OTHER :
return 0;
}
return (i == 0) ? 0
: (i < 0 ? -1
: 1);
}