PG_GETARG_INT32 관련해서
PG_GETARG_INT32(1) 과
PG_GETARG_INT32(2)는 무슨 차이점이 있나요?
즉, 저기 인자값은 무슨 의미를 부여하는지 도움좀 주세요..
-- PG_GETARG_INT32 관련해서
-- PG_GETARG_INT32(1) 과
-- PG_GETARG_INT32(2)는 무슨 차이점이 있나요?
혹시, C/C++ 은 얼마나 알고 있나요?
ex) select add_one(4,2);
add_one
-------------------------------
2
(1 row)
/////////////////
#include "postgres.h"
#include <string.h>
#include "fmgr.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(add_one);
Datum
add_one(PG_FUNCTION_ARGS)
{
int arg1 = PG_GETARG_INT32(0);
int arg2 = PG_GETARG_INT32(1);
PG_RETURN_INT32(arg1 + arg2);
}
왜 인자값을 정상적으로 받지 못하는지 궁금하네요..
#include
음, PG_RETURN_INT32(arg1 + arg2) 직전에 arg1 과 arg2 과 arg1+arg2 의 로그를 한 번 찍어 보세요.
찍어 보았으나 정상적으로 받질 못합니다.. 결국 1버전 포기하고 0버전으로 할려고요 감사합니다. :)
C 조금만 하면 충분히 C 함수를 만들 수 있습니다.
코딩 보다 그 모듈을 빌드하고, DB내 함수로 지정하는 일이 낯설 뿐입니다.
윗 코드에서 조심하셔야 하는 부분은
int arg1 = PG_GETARG_INT32(n);
부분에서 return 값의 자료형을 int 에서 int32 로 pg 내부 자체 선언한 자료형으로 지정하는 것이 안전합니다.
그 외에 별로 할 말이 없습니다. (물론 x86 환경에서는 int나 int32나 차이는 없겠지만)
저 함수의 매개변수로 오는 숫자는 첫번째 인자를 0으로 그 다음 인자를 1... 이렇게 쭉.
PostgreSQL 확장 C 모듈은 pgxs 기능을 이용하는 것이 간편합니다.
몇줄의 Makefile을 만들면 되거든요.
다음은 테스트했던 Makefile 내용입니다.
MODULE_big = add_one OBJS = add_one.o REGRESS = add_one PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS)
다음은 여느 contrib 안에 있는 모듈처럼
make all && make install
로 빌드해서 라이브러리 두는 곳에 두고, (복사 안하고 절대경로를 써도 되기는 합니다.)
db 접속해서,
create function 으로 함수를 등록하면 됩니다.
함수 등록이 두개의 정수형 인자를 받아야 하니까,
create function add_one(int, int) returns int ... 이런 형태여야 하겠지요.
제가 테스트 한 것으로 워낙 단숙한 함수라 별 특이 사항 없이 잘 빌드되고 작동을 잘 했습니다.
V1, V0 문제가 아니라, 작업 도중 뭔가 착각을 했거나, 빼먹었거나, 다른 함수랑 헷갈렸거나 그럴 것 같네요.