PL/pgSQL
veya SQL
ile yazılan işlevler RETURNS void
olarak tanımlanabilir. Son zamanlarda sonuçta garip bir farkla karşılaştım.PostgreSQL işlevleri dönen void
aşağıdaki demo düşünün:
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;
işlevi f_sql()
RETURNS void
bir SQL işlevinde (son komutu gibi) SELECT
için tek olası yol kullanır. Ben sadece bu testin amaçlarının en basit yolu olduğu için kullanıyorum - örneğin UPDATE
veya DELETE
ile başka bir işlev, aynı davranışı gösterir.
Şimdi, void
, kurgusal bir türüdür. plpgsql
işlevi, void
türünde boş bir dize eşdeğerini, ''::void
etkin olarak döndürür gibi görünüyor. sql
işlevi NULL::void
döndürüyor gibi görünüyor.
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
Bu, ince ve kafa karıştırıcı yan etkilere sahip olabilir.
Farkın arkasındaki sebep nedir?
Boşlukları iade ettikleri bildirildi; belki de iade edilen değerlerin * bir şeyle * nasıl kıyaslandığına bakmaktan hiç bir işimiz yoktur. (Eğer * gerçekten * insanların geri dönüş değerine bakmasını engellemeyi tercih ederseniz, onu rastgele bir değer getirebilirdiniz. Bir dahaki sefere boşa dönmesi gereken bir şey yazabilirim.) –
@Catcall: Evet, biri tartışabilir Hiç bir boşluk değerini kontrol etmek bir hataydı. Yine de, seçilen dile bağlı olarak değerin farklı olduğuna dair buggy hissediyor. Bu olmamalı. Bunu yapmak için uğraştığımda bir hata raporu göndereceğim ve çekirdek ekibin ne düşündüğünü göreceğiz. –
Ve birkaç yıl geç [Ben yanıltıcı] (http://dba.stackexchange.com/q/65310/1396) aynı şeyde! Yine de, SELECT NULL :: void'in boş bir sql fonksiyonunda işe yaradığı hile işlevini öğrendim: btw bölümü verdiğiniz bağlantıdan (trick hala 9.3'te çalışmasına rağmen) gitmiş gibi görünüyor. –