Procedury składowane w PostgreSQL/Operatory konwersji typów

Do zdefiniowania operatora konwersji typów (CAST X AS Y) potrzebna jest jedynie funkcja, która przyjmuje jako argument wartość typu źródłowego X, a zwraca typ docelowy Y. Na przykład:

CREATE TYPE xyz AS (x integer, y integer, z integer);

CREATE OR REPLACE FUNCTION xyz_as_integer(r xyz) RETURNS integer AS $$
    BEGIN
        RAISE NOTICE 'xyz_as_integer()';
        -- w tym przypadku nic sensownego
        RETURN r.x + r.y + r.z;
    END
$$ LANGUAGE 'plpgsql';

DROP CAST (xyz AS integer);

CREATE CAST (xyz AS integer)
    WITH FUNCTION xyz_as_integer(xyz)
--  AS ASSIGNMENT
--  AS IMPLICIT
;

Domyślnie zawsze należy wprost podać sposób konwersji, np.

SELECT 5 + CAST(((1,2,3)::xyz) AS integer);

Operator można zadeklarować również jako:

  1. AS IMPLICIT - domyślny,
  2. AS ASSIGNMENT - domyślny przy przypisaniu.

W pierwszym przypadku, zawsze jeśli tylko system znajdzie jednoznaczne rzutowanie, automatycznie je wywoła.

W drugim przypadku konwersja następuje wyłącznie przy wstawianiu (INSERT) lub aktualizacji danych (UPDATE), a więc w przykładzie nie wykona się tylko pierwsze zapytanie.

-- 1. tylko IMPLICIT
SELECT 5 + (1,2,3)::xyz;

-- 2. IMPLICIT oraz ASSIGNMENT
UPDATE table SET pole_calkowite=(5,6,1)::xyz WHERE warunek;

-- 3. IMPLICIT oraz ASSIGNMENT
INSERT INTO table (pole_calkowite) VALUES ((5,6,1)::xyz);