본문 바로가기

PostgreSQL

Atomic function in PostgreSQL 14

PostgreSQL 가 의존성(dependency tracking) 추적을 제공함에도 불구하고 PostgreSQL 14 버전 이전에서는 function body에서의 의존성을 추적하지는 않았다.

 

 

즉, function body에서 정의된 부분에서는 다른 drop이 가능한 오브젝트를 참조하여도, 기존 오브젝트가 drop이 되는 것을 PostgreSQL에서 막지 않아 추후에 기존 오브젝트를 참조하는 function을 실행하려고 할 때 이미 drop된 오브젝트를 참조하여 오류가 발생하는 경우가 발생할 수 있다는 이야기다.

 

 

PostgreSQL 14 이전 버전에서는 PL/pgsql에서 BODY 파트는 일반 텍스트로 취급되었지만, PostgreSQL 14버전부터는 BEGIN ATOMIC이라고 명시함으로써 BODY 파트가 저장시에 파싱되어, 펑션 의존성을 검증할 수 있게 되었다.

[PostgreSQL: Re: Feature matrix updates]

 

PostgreSQL 14버전 이전: function body부분이 string으로 저장됨(function 실행될 때 검증), 의존성 체크 불가능.
PostgreSQL 14버전(ATOMIC 사용시): function 내용은 body부분이 저장시에 parsing되어 검증 후 parse tree로 저장됨,의존성 체크 가능

 

 

-- PostgreSQL 14이전에 사용되던 방식
CREATE FUNCTION subtraction(int, int)
RETURNS int
LANGUAGE SQL
IMMUTABLE PARALLEL SAFE
AS $$
  ....
$$;

-- PostgreSQL 14에서 소개된 ATOMIC 방식
CREATE FUNCTION subtraction(int, int)
RETURNS int
LANGUAGE SQL
IMMUTABLE PARALLEL SAFE
BEGIN ATOMIC
  ....
END;

 

 

 

PostgreSQL 14 Release 내용

  • Allow SQL-language functions and procedures to use SQL-standard function bodies (Peter Eisentraut)
  • Previously only string-literal function bodies were supported. When writing a function or procedure in SQL-standard syntax, the body is parsed immediately and stored as a parse tree. This allows better tracking of function dependencies, and can have security benefits.