ALTER OPERATOR FAMILY
ALTER OPERATOR FAMILY
ALTER OPERATOR FAMILY는 연산자 패밀리(operator family)의 정의를 바꾸는 명령이에요. 패밀리에 연산자와 지원 함수를 추가하거나 제거하고, 패밀리의 이름이나 소유자를 변경할 수 있어요.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
ALTER OPERATOR FAMILY name USING index_method ADD
{ OPERATOR strategy_number operator_name ( op_type, op_type )
[ FOR SEARCH | FOR ORDER BY sort_family_name ]
| FUNCTION support_number [ ( op_type [ , op_type ] ) ]
function_name [ ( argument_type [, ...] ) ]
} [, ... ]
ALTER OPERATOR FAMILY name USING index_method DROP
{ OPERATOR strategy_number ( op_type [ , op_type ] )
| FUNCTION support_number ( op_type [ , op_type ] )
} [, ... ]
ALTER OPERATOR FAMILY name USING index_method
RENAME TO new_name
ALTER OPERATOR FAMILY name USING index_method
OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER OPERATOR FAMILY name USING index_method
SET SCHEMA new_schema
설명 (Description)
ALTER OPERATOR FAMILY는 연산자 패밀리의 정의를 변경해요. 패밀리에 연산자와 지원 함수를 추가하고, 패밀리에서 제거하며, 패밀리의 이름이나 소유자를 바꿀 수 있어요.
ALTER OPERATOR FAMILY로 연산자와 지원 함수를 패밀리에 추가하면, 그것들은 패밀리 안의 특정 연산자 클래스의 일부가 아니라 패밀리 안에서 "느슨한(loose)" 멤버가 돼요. 이것은 그 연산자·함수들이 패밀리의 의미와 호환되지만, 특정 인덱스가 제대로 동작하는 데 필수적이지는 않다는 뜻이에요. (그렇게 필요한 연산자·함수는 대신 연산자 클래스의 일부로 선언해야 해요. CREATE OPERATOR CLASS를 참고하세요.) PostgreSQL은 패밀리의 느슨한 멤버를 언제든 패밀리에서 드롭할 수 있게 허용해요. 하지만 연산자 클래스의 멤버는 전체 클래스와 그에 의존하는 인덱스를 드롭하지 않고는 드롭할 수 없어요. 일반적으로 단일 데이터 타입 연산자와 함수는 특정 데이터 타입의 인덱스를 지원하는 데 필요하므로 연산자 클래스의 일부가 되고, 크로스 데이터 타입 연산자와 함수는 패밀리의 느슨한 멤버가 돼요.
ALTER OPERATOR FAMILY를 쓰려면 슈퍼유저여야 해요. (잘못된 연산자 패밀리 정의가 서버를 혼란에 빠뜨리거나 심지어 크래시시킬 수 있기 때문에 이런 제약이 있어요.)
ALTER OPERATOR FAMILY는 현재 연산자 패밀리 정의가 인덱스 메서드가 요구하는 모든 연산자·함수를 포함하는지, 또 연산자·함수들이 자기 모순이 없는 집합인지 검사하지 않아요. 유효한 연산자 패밀리를 정의하는 것은 사용자의 책임이에요.
자세한 내용은 Section 36.16을 참고하세요.
파라미터 (Parameters)
name — 기존 연산자 패밀리의 이름이에요 (스키마 한정을 써도 돼요).
index_method — 이 연산자 패밀리가 대상으로 하는 인덱스 메서드의 이름이에요.
strategy_number — 연산자와 연결할 인덱스 메서드 전략 번호예요.
operator_name — 연산자 패밀리에 연결할 연산자의 이름 (스키마 한정 가능)이에요.
op_type — 연산자의 피연산자 데이터 타입이에요 (스키마 한정 가능)이에요. DROP에서는 연산자가 지금 지원하는 입력 데이터 타입을 지정해요.
sort_family_name — 정렬 연산자를 위한 기존 정렬 패밀리의 이름 (스키마 한정 가능)이에요. FOR ORDER BY를 지정하면 이 연산자가 해당 정렬 패밀리의 정렬 연산자임을 나타내요.
support_number — 연산자 패밀리에 연결할 인덱스 메서드 지원 함수 번호예요.
function_name — 연산자 패밀리에 연결할 함수의 이름 (스키마 한정 가능)이에요.
argument_type — 함수가 지원하는 입력 데이터 타입이에요.
new_name — 연산자 패밀리의 새 이름이에요.
new_owner — 연산자 패밀리의 새 소유자예요.
new_schema — 연산자 패밀리의 새 스키마예요.
OPERATOR와 FUNCTION 절은 어떤 순서로도 올 수 있어요.
주의 (Notes)
DROP 문법은 전략 번호나 지원 번호, 입력 데이터 타입으로 연산자 패밀리의 "슬롯(slot)"만 지정한다는 점에 유의하세요. 슬롯을 차지하는 연산자나 함수의 이름은 언급되지 않아요. 또한 DROP FUNCTION에서 지정할 타입은 함수가 지원하려는 입력 데이터 타입이에요. GiST, SP-GiST, GIN 인덱스에서는 실제 함수 입력 인자 타입과 무관할 수 있어요.
인덱스 메커니즘은 함수를 사용하기 전에 접근 권한을 검사하지 않기 때문에, 연산자 패밀리에 함수나 연산자를 포함시키는 것은 그것에 대한 public 실행 권한을 부여하는 것과 같아요. 이런 점은 보통 연산자 패밀리에 유용한 종류의 함수들에서는 문제가 되지 않아요.
연산자는 SQL 함수로 정의하면 안 돼요. SQL 함수는 호출하는 쿼리에 인라인될 가능성이 높아서, 옵티마이저가 쿼리가 인덱스와 일치함을 인식하지 못하게 막을 수 있어요.
예제 (Examples)
다음 예제는 int4와 int2 데이터 타입의 B-트리 연산자 클래스를 이미 포함하는 연산자 패밀리에 크로스 데이터 타입 연산자와 지원 함수를 추가해요.
ALTER OPERATOR FAMILY integer_ops USING btree ADD
-- int4 vs int2
OPERATOR 1 < (int4, int2) ,
OPERATOR 2 <= (int4, int2) ,
OPERATOR 3 = (int4, int2) ,
OPERATOR 4 >= (int4, int2) ,
OPERATOR 5 > (int4, int2) ,
FUNCTION 1 btint42cmp(int4, int2) ,
-- int2 vs int4
OPERATOR 1 < (int2, int4) ,
OPERATOR 2 <= (int2, int4) ,
OPERATOR 3 = (int2, int4) ,
OPERATOR 4 >= (int2, int4) ,
OPERATOR 5 > (int2, int4) ,
FUNCTION 1 btint24cmp(int2, int4) ;
이 항목들을 다시 제거하려면:
ALTER OPERATOR FAMILY integer_ops USING btree DROP
-- int4 vs int2
OPERATOR 1 (int4, int2) ,
OPERATOR 2 (int4, int2) ,
OPERATOR 3 (int4, int2) ,
OPERATOR 4 (int4, int2) ,
OPERATOR 5 (int4, int2) ,
FUNCTION 1 (int4, int2) ,
-- int2 vs int4
OPERATOR 1 (int2, int4) ,
OPERATOR 2 (int2, int4) ,
OPERATOR 3 (int2, int4) ,
OPERATOR 4 (int2, int4) ,
OPERATOR 5 (int2, int4) ,
FUNCTION 1 (int2, int4) ;
호환성 (Compatibility)
SQL 표준에는 ALTER OPERATOR FAMILY 문이 없어요.
더 알아보기 (Learn more)
ADD로 넣은 연산자·함수는 패밀리의 "느슨한" 멤버가 되고, 특정 인덱스에 필수적이지 않아 언제든 드롭할 수 있어요.ALTER OPERATOR FAMILY는 슈퍼유저만 사용할 수 있어요.DROP문법은 슬롯(전략/지원 번호 + 입력 타입)만 지정하며 연산자·함수 이름은 지정하지 않아요.