ALTER OPERATOR FAMILY — изменение определения семейства операторов
ALTER OPERATOR FAMILYnameUSINGindex_methodADD { OPERATORstrategy_numberoperator_name(op_type,op_type) [ FOR SEARCH | FOR ORDER BYsort_family_name] | FUNCTIONsupport_number[ (op_type[ ,op_type] ) ]function_name[ (argument_type[, ...] ) ] } [, ... ] ALTER OPERATOR FAMILYnameUSINGindex_methodDROP { OPERATORstrategy_number(op_type[ ,op_type] ) | FUNCTIONsupport_number(op_type[ ,op_type] ) } [, ... ] ALTER OPERATOR FAMILYnameUSINGindex_methodRENAME TOnew_nameALTER OPERATOR FAMILYnameUSINGindex_methodOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILYnameUSINGindex_methodSET SCHEMAnew_schema
Команда ALTER OPERATOR FAMILY изменяет определение
семейства операторов. Вы можете добавлять операторы и вспомогательные функции
в семейство, удалять их из семейства или изменять имя или владельца семейства.
Когда операторы и вспомогательные функции добавляются в семейство с помощью
ALTER OPERATOR FAMILY, они не являются частью какого-либо
конкретного класса операторов внутри семейства, а просто «свободно»
находятся в семействе. Это указывает на то, что эти операторы и функции
совместимы с семантикой семейства, но не требуются для
корректной работы какого-либо конкретного индекса. (Операторы и функции,
которые действительно требуются, должны быть объявлены как часть класса операторов;
см. CREATE OPERATOR CLASS.)
Digital Q.DataBase позволяет удалять свободные члены семейства
в любое время, но члены класса операторов не могут быть удалены без удаления всего класса и
любых индексов, которые от него зависят.
Как правило, операторы и функции для одного типа данных
являются частью классов операторов, потому что они необходимы для
поддержки индекса для этого конкретного типа данных, в то время как операторы и функции для разных типов данных
делаются свободными членами семейства.
Для использования ALTER OPERATOR FAMILY необходимо быть суперпользователем.
(Это ограничение введено, потому что ошибочное определение семейства операторов
может привести к путанице или даже к аварийному завершению сервера.)
В настоящее время ALTER OPERATOR FAMILY не проверяет,
включает ли определение семейства операторов все операторы и
функции, требуемые методом индексирования, а также образуют ли операторы и
функции внутренне непротиворечивый набор. Ответственность за определение
корректного семейства операторов лежит на пользователе.
Дополнительную информацию см. в Раздел 5.1.16.
nameИмя (возможно, с указанием схемы) существующего семейства операторов.
index_methodИмя метода индексирования, для которого предназначено это семейство операторов.
strategy_numberСтратегический номер оператора в методе индексирования, связанный с семейством операторов.
operator_nameИмя (возможно, с указанием схемы) оператора, связанного с семейством операторов.
op_type
В предложении OPERATOR —
тип(ы) данных операндов оператора, или NONE для
обозначения префиксного оператора. В отличие от аналогичного
синтаксиса в команде CREATE OPERATOR CLASS, тип(ы) данных операндов
должны быть указаны всегда.
В предложении ADD FUNCTION — тип(ы) данных операндов, которые
функция предназначена поддерживать, если они отличаются от
входного(ых) типа(ов) данных функции. Для функций сравнения B-дерева
и хеш-функций не требуется указывать op_type, поскольку входные
типы данных функции всегда являются правильными для использования. Для функций поддержки сортировки B-дерева,
функций equal image B-дерева и всех
функций в классах операторов GiST, SP-GiST и GIN
необходимо указать тип(ы) данных операндов, с которыми функция должна
использоваться.
В предложении DROP FUNCTION необходимо указать тип(ы) данных операндов, которые
функция предназначена поддерживать.
sort_family_name
Имя (возможно, с указанием схемы) существующего семейства операторов btree,
описывающего порядок сортировки, связанный с оператором упорядочивания.
Если ни FOR SEARCH, ни FOR ORDER BY не указаны,
по умолчанию используется FOR SEARCH.
support_numberНомер вспомогательной функции в методе индексирования для функции, связанной с семейством операторов.
function_nameИмя (возможно, с указанием схемы) функции, которая является вспомогательной функцией метода индексирования для семейства операторов. Если список аргументов не указан, имя должно быть уникальным в своей схеме.
argument_typeТип(ы) данных параметра(ов) функции.
new_nameНовое имя семейства операторов.
new_ownerНовый владелец семейства операторов.
new_schemaНовая схема для семейства операторов.
Предложения OPERATOR и FUNCTION
могут появляться в любом порядке.
Обратите внимание, что синтаксис DROP указывает только «слот»
в семействе операторов, по стратегическому или вспомогательному номеру и входному(ым) типу(ам) данных.
Имя оператора или функции, занимающей слот, не указывается.
Кроме того, для DROP FUNCTION тип(ы) данных, которые нужно указать, —
это входной(ые) тип(ы) данных, которые функция предназначена поддерживать; для
индексов GiST, SP-GiST и GIN они могут не иметь ничего общего с фактическими
типами входных аргументов функции.
Поскольку механизм индексирования не проверяет права доступа к функциям перед их использованием, включение функции или оператора в семейство операторов равносильно предоставлению публичного права на выполнение для них. Обычно это не является проблемой для тех видов функций, которые полезны в семействе операторов.
Операторы не должны быть определены с помощью SQL-функций. SQL-функция, скорее всего, будет встроена в вызывающий запрос, что помешает планировщику распознать, что запрос соответствует индексу.
До Digital Q.DataBase 8.4 предложение OPERATOR
могло включать опцию RECHECK. Сейчас она больше не поддерживается,
потому что то, является ли индексный оператор «неточным»,
теперь определяется динамически во время выполнения. Это позволяет эффективно обрабатывать
случаи, когда оператор может быть как точным, так и неточным.
Следующая примерная команда добавляет операторы и вспомогательные функции для разных типов данных
в семейство операторов, которое уже содержит классы операторов B-дерева
для типов данных int4 и int2.
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) ;
В стандарте SQL нет оператора ALTER OPERATOR FAMILY.