// Prepare the arguments for a comparison operation. The returned arguments // will have the same type. func prepareComparisonArgs(left, right sqlwire.Datum) (opType, sqlwire.Datum, sqlwire.Datum, error) { // If both arguments are strings (or string-like), compare as strings. if (left.BytesVal != nil || left.StringVal != nil) && (right.BytesVal != nil || right.StringVal != nil) { return stringOp, left.ToString(), right.ToString(), nil } // If both arguments are uints, compare as unsigned. if left.UintVal != nil && right.UintVal != nil { return uintOp, left, right, nil } var err error // If both arguments are integers (signed or unsigned), compare as integers. if (left.BoolVal != nil || left.IntVal != nil || left.UintVal != nil) && (right.BoolVal != nil || right.IntVal != nil || right.UintVal != nil) { left, err = left.ToInt() if err != nil { return intOp, null, null, err } right, err = right.ToInt() if err != nil { return intOp, null, null, err } return intOp, left, right, nil } // In all other cases, compare as floats. left, err = left.ToFloat() if err != nil { return intOp, null, null, err } right, err = right.ToFloat() if err != nil { return intOp, null, null, err } return floatOp, left, right, nil }