Q:

Problema Funcion SQL Error: not allowed to return a result set from a function

no veo para nada el problema de esta función, intento validar el pin de un usuario, pero me sale este error, he estado mirando en otras preguntas pero no veo el problema.
Les dejo el código aquí abajo:
CREATE DEFINER=`root`@`localhost` FUNCTION `validar_pin`(id_usuario int, pin int) RETURNS BOOLEAN
BEGIN
    DECLARE pin_user int;
    DECLARE fecha DATE;
    select desbloqueo into fecha from Usuario where id = id_usuario;
    if fecha = null then
        SELECT pin into pin_user FROM Usuario where id_usuario = id;
        if (pin = pin_user) THEN
            UPDATE Usuario SET num_intentos = 0 WHERE id = id_usuario;
            UPDATE Usuario SET desbloqueo = NULL WHERE id = id_usuario;
            RETURN TRUE;
        else
            UPDATE Usuario SET num_intentos = (num_intentos + 1) WHERE id = id_usuario;
        end if;
    end if;
    if (select num_intentos from Usuario where id = id_usuario) = 3 then
        UPDATE Usuario SET desbloqueo = DATE_ADD(NOW(), INTERVAL 1 DAY) WHERE id = id_usuario;
        select "Has agotado todas las oportunidades, intentalo en 24h";
    end if;
    RETURN FALSE;
END

Alguna sugerencia??
Gracias

A:

El problema es que dentro de las funciones no puedes hacer un select sin decir en donde quieres guardar los datos por así decirlo. 
O sea ésto estaría mal dentro de una función:
select nombre from usuario;

En tu función tienes varias partes en que haces un select y no insertas el valor, por ejemplo acá:
if (select num_intentos from Usuario where id = id_usuario) = 3 then

Deberías primero obtener ese numero y guardarlo en una variable y luego es que preguntas por esa variable:
 select num_intentos into _num_intentos from Usuario where id = id_usuario
 if(_num_intentos = 3) then
 ....

En la documentación lo indican (si es que usas mysql, asumo eso):
procedimientos y funciones

Statements that return a result set can be used within a stored procedure but not within a stored function. This prohibition includes SELECT statements that do not have an INTO var_list clause and other statements

Dice las declaraciones que retornan un listado de resultados pueden ser usadas dentro de procedimientos almacenados pero no dentro de funciones almacenadas, esta prohibición incluye los SELECTS que no tengan una claúsula INTO a una variable y otras declaraciones.

