CREATE TRANSFORM
CREATE TRANSFORM
프로시저 언어로 함수를 쓸 때, 그 언어가 모르는 데이터 타입을 만나면 어떻게 해야 할까요? 예를 들어 PL/Python에서 hstore 타입을 쓴다면 Python 환경에서 hstore 값을 어떻게 표현해야 할지 PL/Python은 원래 알지 못해요. 이럴 때 그 타입을 특정 프로시저 언어에 맞게 적응시키는 방법을 정의하는 게 바로 트랜스폼(transform)이고, CREATE TRANSFORM이 그걸 새로 만드는 명령이에요. CREATE OR REPLACE TRANSFORM은 새 트랜스폼을 만들거나 기존 정의를 대체해요.
트랜스폼은 보통 두 개의 함수를 지정해요. 하나는 타입을 SQL 환경에서 언어로 바꾸는 "from SQL" 함수로, 언어로 작성된 함수의 인자에 호출돼요. 다른 하나는 타입을 언어에서 SQL 환경으로 바꾸는 "to SQL" 함수로, 언어로 작성된 함수의 반환 값에 호출돼요. 필요한 방향의 함수만 있어도 되고, 특정 방향의 변환을 아예 막고 싶다면 항상 오류를 내는 트랜스폼 함수를 쓰는 방법도 있어요.
트랜스폼을 만들려면 타입을 소유하고 USAGE 권한이 있어야 하고, 언어에 대한 USAGE 권한이 있어야 하며, 지정한 from-SQL·to-SQL 함수를 소유하고 EXECUTE 권한이 있어야 해요.
출처: PostgreSQL 문서
본문
Synopsis
CREATE [ OR REPLACE ] TRANSFORM FOR type_name LANGUAGE lang_name (
FROM SQL WITH FUNCTION from_sql_function_name [ (argument_type [, ...]) ],
TO SQL WITH FUNCTION to_sql_function_name [ (argument_type [, ...]) ]
);
Description
CREATE TRANSFORM은 새 트랜스폼을 정의해요. CREATE OR REPLACE TRANSFORM은 새 트랜스폼을 만들거나 기존 정의를 대체해요.
트랜스폼은 데이터 타입을 프로시저 언어에 어떻게 적응시킬지 지정해요. 예를 들어 PL/Python에서 hstore 타입으로 함수를 쓸 때, PL/Python은 hstore 값을 Python 환경에서 어떻게 표현해야 할지 사전에 알지 못해요. 언어 구현은 보통 텍스트 표현을 기본으로 쓰지만, 예를 들어 연관 배열이나 리스트가 더 적절할 때는 불편하죠.
트랜스폼은 두 함수를 지정해요.
- 타입을 SQL 환경에서 언어로 변환하는 "from SQL" 함수예요. 이 함수는 그 언어로 작성된 함수의 인자에 호출돼요.
- 타입을 언어에서 SQL 환경으로 변환하는 "to SQL" 함수예요. 이 함수는 그 언어로 작성된 함수의 반환 값에 호출돼요.
이 두 함수를 모두 제공할 필요는 없어요. 하나를 지정하지 않으면 필요할 때 언어별 기본 동작이 사용돼요. (특정 방향의 변환이 전혀 일어나지 않게 하려면 항상 오류를 내는 트랜스폼 함수를 쓸 수도 있어요.)
트랜스폼을 만들려면 타입을 소유하고 USAGE 권한이 있어야 하고, 언어에 대한 USAGE 권한이 있어야 하며, 지정하면 from-SQL·to-SQL 함수를 소유하고 EXECUTE 권한이 있어야 해요.
Parameters
type_name
트랜스폼의 데이터 타입 이름이에요.
lang_name
트랜스폼의 언어 이름이에요.
from_sql_function_name[(argument_type [, ...])]
타입을 SQL 환경에서 언어로 변환하는 함수의 이름이에요. internal 타입의 인자 하나를 받고 internal 타입을 반환해야 해요. 실제 인자는 트랜스폼의 타입일 텐데, 함수는 그런 것처럼 코딩되어야 해요. (하지만 internal 타입의 인자를 적어도 하나 없이 internal을 반환하는 SQL 수준 함수를 선언하는 것은 허용되지 않아요.) 실제 반환 값은 언어 구현에 특화된 무언가일 거예요. 인자 목록을 지정하지 않으면 함수 이름은 그 스키마에서 고유해야 해요.
to_sql_function_name[(argument_type [, ...])]
타입을 언어에서 SQL 환경으로 변환하는 함수의 이름이에요. internal 타입의 인자 하나를 받고 트랜스폼의 타입인 타입을 반환해야 해요. 실제 인자 값은 언어 구현에 특화된 무언가일 거예요. 인자 목록을 지정하지 않으면 함수 이름은 그 스키마에서 고유해야 해요.
Notes
트랜스폼을 제거하려면 DROP TRANSFORM을 사용해요.
Examples
타입 hstore와 언어 plpython3u에 대한 트랜스폼을 만들려면, 먼저 타입과 언어를 설정해요.
CREATE TYPE hstore ...;
CREATE EXTENSION plpython3u;
그다음 필요한 함수를 만들어요.
CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS ...;
CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore
LANGUAGE C STRICT IMMUTABLE
AS ...;
마지막으로 이들을 모두 연결하는 트랜스폼을 만들어요.
CREATE TRANSFORM FOR hstore LANGUAGE plpython3u (
FROM SQL WITH FUNCTION hstore_to_plpython(internal),
TO SQL WITH FUNCTION plpython_to_hstore(internal)
);
실제로는 이 명령들이 확장(extension)으로 묶이는 경우가 많아요.
contrib 섹션에는 트랜스폼을 제공하는 확장이 여럿 있어서 실제 사례로 참고할 수 있어요.
Compatibility
이 형태의 CREATE TRANSFORM은 PostgreSQL 확장 기능이에요. SQL 표준에도 CREATE TRANSFORM 명령이 있지만, 그건 데이터 타입을 클라이언트 언어에 적응시키기 위한 것이에요. 그 용법은 PostgreSQL이 지원하지 않아요.
더 알아보기 (Learn more)
CREATE FUNCTION— from-SQL·to-SQL 함수로 쓰일 함수를 만들 때 써요.CREATE LANGUAGE— 프로시저 언어를 등록할 때 써요.CREATE TYPE— 트랜스폼의 대상이 되는 데이터 타입을 만들 때 써요.DROP TRANSFORM— 트랜스폼을 제거할 때 써요.