Le funzioni scritte in PL/pgSQL
o SQL
possono essere definite come RETURNS void
. Recentemente ho incappato in una strana differenza nel risultato.Funzioni PostgreSQL restituite void
Si consideri il seguente demo:
CREATE OR REPLACE FUNCTION f_sql()
RETURNS void AS
'SELECT NULL::void' -- "do nothing", no special meaning
LANGUAGE sql;
CREATE OR REPLACE FUNCTION f_plpgsql()
RETURNS void AS
$$
BEGIN
NULL; -- "do nothing", no special meaning
END;
$$ LANGUAGE plpgsql;
La funzione f_sql()
usa l'unica via possibile per un SELECT
(come ultimo comando) in una funzione SQL che RETURNS void
. Lo uso solo perché è il modo più semplice per gli scopi di questo test - qualsiasi altra funzione, con UPDATE
o DELETE
per esempio, mostra lo stesso comportamento.
Ora, void
è un tipo fittizio. Mentre la funzione plpgsql
sembra restituire l'equivalente di una stringa vuota come tipo void
, efficacemente ''::void
. La funzione sql
sembra restituire NULL::void
.
db=# SELECT f_sql() IS NULL;
?column?
----------
t
db=# SELECT f_sql()::text IS NULL;
?column?
----------
t
db=# SELECT f_plpgsql() IS NULL;
?column?
----------
f
db=# SELECT f_plpgsql()::text = '';
?column?
----------
t
Questo può avere effetti secondari sottili e confusi.
Qual è la ragione della differenza?
Sono dichiarati a rendere nulla; forse non abbiamo alcun problema a vedere come i loro valori restituiti siano paragonabili a * qualsiasi cosa *. (Se * davvero * volesse scoraggiare le persone dal considerare il valore restituito, potresti farlo restituire un valore casuale. Potrei farlo la prossima volta che scriverò qualcosa che dovrebbe restituire nulla.) –
@Catcall: Sì, si potrebbe discutere che è stato un errore controllare il valore di un vuoto. Tuttavia, sembra che il valore sia diverso a seconda della lingua scelta. Questo non dovrebbe essere. Inserirò una segnalazione di bug quando andrò in giro per farlo e vedremo cosa ne pensa la squadra centrale. –
E diversi anni in ritardo [inciampo] (http://dba.stackexchange.com/q/65310/1396) sulla stessa cosa! Ho comunque imparato il tuo utile trucco di 'SELECT NULL :: void' in una funzione sql di restituzione vuota: btw il capitolo sembra essere andato via dal link che hai dato (anche se il trucco funziona ancora in 9.3). –