CREATE OPERATOR CLASS
CREATE OPERATOR CLASS — создать класс операторов
Синтаксис
CREATE OPERATOR CLASSимя
[ DEFAULT ] FOR TYPEтип_данных
USINGиндексный_метод
[ FAMILYимя_семейства
] AS { OPERATORномер_стратегии
имя_оператора
[ (тип_операнда
,тип_операнда
) ] [ FOR SEARCH | FOR ORDER BYсемейство_сортировки
] | FUNCTIONномер_опорной_функции
[ (тип_операнда
[ ,тип_операнда
] ) ]имя_функции
(тип_аргумента
[, ...] ) | STORAGEтип_хранения
} [, ... ]
Описание
CREATE OPERATOR CLASS
создаёт класс операторов. Класс операторов устанавливает, как данный тип будет использоваться в индексе, определяя, какие операторы исполняют конкретные роли или «стратегии» для этого типа данных и метода индекса. Также класс операторов определяет опорные функции, которые будет задействовать метод индекса в случае выбора данного класса для столбца индекса. Все операторы и функции, используемые классом операторов, должны существовать до создания этого класса.
Если указывается имя схемы, класс операторов создаётся в указанной схеме, в противном случае — в текущей. Два класса операторов в одной схеме могут иметь одинаковые имена, только если они предназначены для разных методов индекса.
Владельцем класса операторов становится пользователь, создавший его. В настоящее время создавать классы операторов могут только суперпользователи. (Это ограничение введено потому, что ошибочное определение класса может вызвать нарушения или даже сбой в работе сервера.)
CREATE OPERATOR CLASS
в настоящее время не проверяет, включает ли определение класса операторов все операторы и функции, требуемые для метода индекса, и образуют ли они целостный набор. Ответственность за правильность определения класса операторов лежит на пользователе.
Связанные классы операторов могут быть сгруппированы в семейства операторов. Чтобы поместить класс в существующее семейство, добавьте параметр FAMILY
в CREATE OPERATOR CLASS
. Без этого параметра новый класс помещается в семейство, имеющее то же имя, что и класс (если такое семейство не существует, оно создаётся).
За дополнительными сведениями обратитесь к Разделу 38.16.
Параметры
имя
Имя создаваемого класса операторов, возможно, дополненное схемой.
DEFAULT
Если присутствует это указание, класс операторов становится классом по умолчанию для своего типа данных. Для определённого типа данных и метода индекса можно определить не больше одного класса операторов по умолчанию.
тип_данных
Тип данных столбца, для которого предназначен этот класс операторов.
индексный_метод
Имя индексного метода, для которого предназначен этот класс операторов.
имя_семейства
Имя существующего семейства операторов, в которое будет добавлен этот класс. Если не указано, подразумевается семейство с тем же именем, что и класс (если такое семейство не существует, оно создаётся).
номер_стратегии
Номер стратегии индексного метода для оператора, связанного с данным классом операторов.
имя_оператора
Имя (возможно, дополненное схемой) оператора, связанного с данным классом операторов.
тип_операнда
В предложении
OPERATOR
это тип данных операнда, либо ключевое словоNONE
, характеризующее префиксный оператор. Типы операндов обычно можно опустить, когда они совпадают с типом данных класса операторов.В предложении
FUNCTION
это тип данных операнда, который должна поддерживать эта функция, если он отличается от входного типа данных функции (для функций сравнения в B-деревьях и хеш-функций) или от типа данных класса (для опорных функций сортировки и функций равенства образов в B-деревьях, а также для всех функций в классах операторов GiST, SP-GiST, GIN и BRIN). Обычно предполагаемые по умолчанию типы оказываются подходящими, так чтотип_операнда
указывать вFUNCTION
не нужно (если это не функции сортировки в B-дереве, которые предназначены для сравнения разных типов данных).семейство_сортировки
Имя (возможно, дополненное схемой) существующего семейства операторов
btree
, описывающего порядок сортировки, связанный с оператором сортировки.Если не указано ни
FOR SEARCH
(для поиска), ниFOR ORDER BY
(для сортировки), подразумеваетсяFOR SEARCH
.номер_опорной_функции
Номер опорной функции индексного метода для функции, связанной с данным классом операторов.
имя_функции
Имя (возможно, дополненное схемой) функции, которая является опорной функцией индексного метода для данного класса операторов.
тип_аргумента
Тип данных параметра функции.
тип_хранения
Тип данных, фактически сохраняемых в индексе. Обычно это тип данных столбца, но некоторые методы индекса (в настоящее время, GiST, GIN, SP-GiST и BRIN) могут работать с отличным от него типом. Предложение
STORAGE
может присутствовать, только если метод индекса позволяет использовать другой тип данных. Еслитип_данных
столбца задан какanyarray
,тип_хранения
может быть объявлен какanyelement
, чтобы показать, что записи в индексе являются членами типа элемента, принадлежащего к фактическому типу массива, для которого создаётся конкретный индекс.
Предложения OPERATOR
, FUNCTION
и STORAGE
могут указываться в любом порядке.
Примечания
Так как механизмы индексов не проверяют права доступа к функциям, прежде чем вызывать их, включение функций или операторов в класс операторов по сути даёт всем право на выполнение их. Обычно это не проблема для таких функций, какие бывают полезны в классе операторов.
Операторы не должны реализовываться в функциях на языке SQL. SQL-функция вероятнее всего будет встроена в вызывающий запрос, что помешает оптимизатору понять, что этот запрос соответствует индексу.
До PostgreSQL 8.4 предложение OPERATOR
могло включать указание RECHECK
. Теперь это не поддерживается, так как оператор индекса может быть «неточным» и это определяется на ходу в момент выполнения. Это позволяет эффективно справляться с ситуациями, когда оператор может быть или не быть неточным.
Примеры
Команда в следующем примере определяет класс операторов индекса GiST для типа данных _int4
(массива из int4
). Полный пример приведён в модуле intarray.
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = (anyarray, anyarray), OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal), FUNCTION 2 g_int_union (internal, internal), FUNCTION 3 g_int_compress (internal), FUNCTION 4 g_int_decompress (internal), FUNCTION 5 g_int_penalty (internal, internal, internal), FUNCTION 6 g_int_picksplit (internal, internal), FUNCTION 7 g_int_same (_int4, _int4, internal);
Совместимость
CREATE OPERATOR CLASS
является расширением PostgreSQL. Команда CREATE OPERATOR CLASS
отсутствует в стандарте SQL.
ALTER MATERIALIZED VIEW
ALTER MATERIALIZED VIEW — change the definition of a materialized view
Synopsis
ALTER MATERIALIZED VIEW [ IF EXISTS ]name
action
[, ... ] ALTER MATERIALIZED VIEWname
[ NO ] DEPENDS ON EXTENSIONextension_name
ALTER MATERIALIZED VIEW [ IF EXISTS ]name
RENAME [ COLUMN ]column_name
TOnew_column_name
ALTER MATERIALIZED VIEW [ IF EXISTS ]name
RENAME TOnew_name
ALTER MATERIALIZED VIEW [ IF EXISTS ]name
SET SCHEMAnew_schema
ALTER MATERIALIZED VIEW ALL IN TABLESPACEname
[ OWNED BYrole_name
[, ... ] ] SET TABLESPACEnew_tablespace
[ NOWAIT ] whereaction
is one of: ALTER [ COLUMN ]column_name
SET STATISTICSinteger
ALTER [ COLUMN ]column_name
SET (attribute_option
=value
[, ... ] ) ALTER [ COLUMN ]column_name
RESET (attribute_option
[, ... ] ) ALTER [ COLUMN ]column_name
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER [ COLUMN ]column_name
SET COMPRESSIONcompression_method
CLUSTER ONindex_name
SET WITHOUT CLUSTER SET ACCESS METHODnew_access_method
SET TABLESPACEnew_tablespace
SET (storage_parameter
[=value
] [, ... ] ) RESET (storage_parameter
[, ... ] ) OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER }
Description
ALTER MATERIALIZED VIEW
changes various auxiliary properties of an existing materialized view.
You must own the materialized view to use ALTER MATERIALIZED VIEW
. To change a materialized view's schema, you must also have CREATE
privilege on the new schema. To alter the owner, you must also be a direct or indirect member of the new owning role, and that role must have CREATE
privilege on the materialized view's schema. (These restrictions enforce that altering the owner doesn't do anything you couldn't do by dropping and recreating the materialized view. However, a superuser can alter ownership of any view anyway.)
The statement subforms and actions available for ALTER MATERIALIZED VIEW
are a subset of those available for ALTER TABLE
, and have the same meaning when used for materialized views. See the descriptions for ALTER TABLE
for details.
Parameters
name
The name (optionally schema-qualified) of an existing materialized view.
column_name
Name of an existing column.
extension_name
The name of the extension that the materialized view is to depend on (or no longer dependent on, if
NO
is specified). A materialized view that's marked as dependent on an extension is automatically dropped when the extension is dropped.new_column_name
New name for an existing column.
new_owner
The user name of the new owner of the materialized view.
new_name
The new name for the materialized view.
new_schema
The new schema for the materialized view.
Examples
To rename the materialized view foo
to bar
:
ALTER MATERIALIZED VIEW foo RENAME TO bar;
Compatibility
ALTER MATERIALIZED VIEW
is a Postgres Pro extension.