9.13. Функции и операторы текстового поиска

В Таблице 9.41, Таблице 9.42 и Таблице 9.43 собраны все существующие функции и операторы, предназначенные для полнотекстового поиска. Во всех деталях возможности полнотекстового поиска в PostgreSQL описаны в Главе 12.

Таблица 9.41. Операторы текстового поиска

Оператор | Тип результата | Описание | Пример | Результат
@@ | boolean | tsvector соответствует tsquery ? | to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') | t
@@@ | boolean | устаревший синоним для @@ | to_tsvector('fat cats ate rats') @@@ to_tsquery('cat & rat') | t
|| | tsvector | объединяет два значения tsvector | 'a:1 b:2'::tsvector || 'c:1 d:2 b:3'::tsvector | 'a':1 'b':2,5 'c':3 'd':4
&& | tsquery | логическое И (AND) двух запросов tsquery | 'fat | rat'::tsquery && 'cat'::tsquery | ( 'fat' | 'rat' ) & 'cat'
|| | tsquery | логическое ИЛИ (OR) двух запросов tsquery | 'fat | rat'::tsquery || 'cat'::tsquery | ( 'fat' | 'rat' ) | 'cat'
!! | tsquery | отрицание запроса tsquery | !! 'cat'::tsquery | !'cat'
<-> | tsquery | tsquery предшествует tsquery | to_tsquery('fat') <-> to_tsquery('rat') | 'fat' <-> 'rat'
@> | boolean | запрос tsquery включает другой? | 'cat'::tsquery @> 'cat & rat'::tsquery | f
<@ | boolean | запрос tsquery включён в другой? | 'cat'::tsquery <@ 'cat & rat'::tsquery | t

Примечание

Операторы включения tsquery рассматривают только лексемы двух запросов, игнорируя операторы их сочетания.

В дополнение к операторам, перечисленным в этой таблице, для типов tsvector и tsquery определены обычные операторы сравнения для B-дерева (=, < и т. д.). Они не очень полезны для поиска, но позволяют, в частности, создавать индексы для столбцов этих типов.

Таблица 9.42. Функции текстового поиска

Функция | Тип результата | Описание | Пример | Результат
array_to_tsvector(text[]) | tsvector | преобразует массив лексем в tsvector | array_to_tsvector('{fat,cat,rat}'::text[]) | 'cat' 'fat' 'rat'
get_current_ts_config() | regconfig | получает конфигурацию текстового поиска по умолчанию | get_current_ts_config() | english
length(tsvector) | integer | число лексем в значении tsvector | length('fat:2,4 cat:3 rat:5A'::tsvector) | 3
numnode(tsquery) | integer | число лексем и операторов в запросе tsquery | numnode('(fat & rat) | cat'::tsquery) | 5
plainto_tsquery([конфигурация regconfig ,] query text) | tsquery | выдаёт значение tsquery, игнорируя пунктуацию | plainto_tsquery('english', 'The Fat Rats') | 'fat' & 'rat'
phraseto_tsquery([конфигурация regconfig ,] query text) | tsquery | выдаёт значение tsquery для поиска фразы, игнорируя пунктуацию | phraseto_tsquery('english', 'The Fat Rats') | 'fat' <-> 'rat'
websearch_to_tsquery([конфигурация regconfig ,] query text) | tsquery | преобразует в значение tsquery поисковый запрос в веб-стиле | websearch_to_tsquery('english', '"fat rat" or rat') | 'fat' <-> 'rat' | 'rat'
querytree(query tsquery) | text | получает индексируемую часть запроса tsquery | querytree('foo & ! bar'::tsquery) | 'foo'
setweight(вектор tsvector, вес "char") | tsvector | назначает вес каждому элементу вектора | setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A') | 'cat':3A 'fat':2A,4A 'rat':5A
setweight(вектор tsvector, вес "char", лексемы text[]) | tsvector | назначает вес элементам вектора, перечисленным в массиве лексемы | setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A', '{cat,rat}') | 'cat':3A 'fat':2,4 'rat':5A
strip(tsvector) | tsvector | убирает позиции и веса из значения tsvector | strip('fat:2,4 cat:3 rat:5A'::tsvector) | 'cat' 'fat' 'rat'
to_tsquery([конфигурация regconfig ,] query text) | tsquery | нормализует слова и переводит их в tsquery | to_tsquery('english', 'The & Fat & Rats') | 'fat' & 'rat'
to_tsvector([конфигурация regconfig ,] документ text) | tsvector | сокращает текст документа до значения tsvector | to_tsvector('english', 'The Fat Rats') | 'fat':2 'rat':3
to_tsvector([конфигурация regconfig ,] документ json(b)) | tsvector | сокращает каждое строковое значение в документе до значения tsvector, а затем складывает эти значения по порядку в документе и выдаёт один tsvector | to_tsvector('english', '{"a": "The Fat Rats"}'::json) | 'fat':2 'rat':3
json(b)_to_tsvector([конфигурация regconfig,] документ json(b), фильтр json(b)) | tsvector | сокращает каждое значение в документе, заданное фильтром, до вектора tsvector, а затем соединяет их в порядке следования в документе и получает один tsvector. Фильтр представляет собой массив jsonb, в котором перечисляются типы элементов, которые должны войти в результирующий tsvector. Возможные значения для элементов фильтра: "string" (включить все строковые значения), "numeric" (включить все числовые значения в виде строк), "boolean" (включить все логические значения в виде "true"/"false"), "key" (включить все ключи) или "all" (включить всё вышеперечисленное). Эти значения можно комбинировать для включения, например, всех строковых и числовых значений. | json_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::json, '["string", "numeric"]') | '123':5 'fat':2 'rat':3
ts_delete(вектор tsvector, лексема text) | tsvector | удаляет заданную лексему из вектора | ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat') | 'cat':3 'rat':5A
ts_delete(вектор tsvector, лексемы text[]) | tsvector | удаляет все вхождения лексем, перечисленных в массиве лексемы, из вектора | ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat']) | 'cat':3
ts_filter(вектор tsvector, веса "char"[]) | tsvector | выбирает из вектора только элементы с заданным весом | ts_filter('fat:2,4 cat:3b rat:5A'::tsvector, '{a,b}') | 'cat':3B 'rat':5A
ts_headline([конфигурация regconfig,] документ text, query tsquery [, параметры text]) | text | выводит фрагмент, соответствующий запросу | ts_headline('x y z', 'z'::tsquery) | x y <b>z</b>
ts_headline([конфигурация regconfig,] документ json(b), query tsquery [, параметры text]) | text | выводит фрагмент, соответствующий запросу | ts_headline('{"a":"x y z"}'::json, 'z'::tsquery) | {"a":"x y <b>z</b>"}
ts_rank([веса float4[],] вектор tsvector, query tsquery [, нормализация integer]) | float4 | вычисляет ранг документа по отношению к запросу | ts_rank(textsearch, query) | 0.818
ts_rank_cd([веса float4[],] вектор tsvector, query tsquery [, нормализация integer]) | float4 | вычисляет ранг документа по отношению к запросу, используя плотность покрытия (CDR) | ts_rank_cd('{0.1, 0.2, 0.4, 1.0}', textsearch, query) | 2.01317
ts_rewrite(query tsquery, цель tsquery, замена tsquery) | tsquery | подставляет в запросе вместо цели замену | ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'foo|bar'::tsquery) | 'b' & ( 'foo' | 'bar' )
ts_rewrite(query tsquery, выборка text) | tsquery | заменяет элементы запроса, выбирая цели и подстановки командой SELECT | SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM aliases') | 'b' & ( 'foo' | 'bar' )
tsquery_phrase(запрос1 tsquery, запрос2 tsquery) | tsquery | создаёт запрос, который ищет запрос1, за которым идёт запрос2 (как делает оператор <->) | tsquery_phrase(to_tsquery('fat'), to_tsquery('cat')) | 'fat' <-> 'cat'
tsquery_phrase(запрос1 tsquery, запрос2 tsquery, расстояние integer) | tsquery | создаёт запрос, который ищет запрос1, за которым идёт запрос2 на заданном расстоянии | tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10) | 'fat' <10> 'cat'
tsvector_to_array(tsvector) | text[] | преобразует tsvector в массив лексем | tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector) | {cat,fat,rat}
tsvector_update_trigger() | trigger | триггерная функция для автоматического изменения столбца типа tsvector | CREATE TRIGGER ... tsvector_update_trigger(tsvcol, 'pg_catalog.​swedish', title, body) |
tsvector_update_trigger_column() | trigger | триггерная функция для автоматического изменения столбца типа tsvector | CREATE TRIGGER ... tsvector_update_trigger_column(tsvcol, configcol, title, body) |
unnest(tsvector, OUT лексема text, OUT позиции smallint[], OUT веса text) | setof record | разворачивает tsvector в набор строк | unnest('fat:2,4 cat:3 rat:5A'::tsvector) | (cat,{3},{D}) ...

Примечание

Все функции текстового поиска, принимающие необязательный аргумент regconfig, будут использовать конфигурацию, указанную в параметре default_text_search_config, когда этот аргумент опущен.

Функции в Таблице 9.43 перечислены отдельно, так как они не очень полезны в традиционных операциях поиска. Они предназначены в основном для разработки и отладки новых конфигураций текстового поиска.

Таблица 9.43. Функции отладки текстового поиска

Функция | Тип результата | Описание | Пример | Результат
ts_debug([конфигурация regconfig,] документ text, OUT псевдоним text, OUT описание text, OUT фрагмент text, OUT словари regdictionary[], OUT словарь regdictionary, OUT лексемы text[]) | setof record | проверяет конфигурацию | ts_debug('english', 'The Brightest supernovaes') | (asciiword,"Word, all ASCII",The,{​english_stem​},​english_stem,{}) ...
ts_lexize(словарь regdictionary, фрагмент text) | text[] | проверяет словарь | ts_lexize('english_stem', 'stars') | {star}
ts_parse(имя_анализатора text, документ text, OUT код_фрагмента integer, OUT фрагмент text) | setof record | проверяет анализатор | ts_parse('default', 'foo - bar') | (1,foo) ...
ts_parse(oid_анализатора oid, документ text, OUT код_фрагмента integer, OUT фрагмент text) | setof record | проверяет анализатор | ts_parse(3722, 'foo - bar') | (1,foo) ...
ts_token_type(имя_анализатора text, OUT код_фрагмента integer, OUT псевдоним text, OUT описание text) | setof record | получает типы фрагментов, определённые анализатором | ts_token_type('default') | (1,asciiword,"Word, all ASCII") ...
ts_token_type(oid_анализатора oid, OUT код_фрагмента integer, OUT псевдоним text, OUT описание text) | setof record | получает типы фрагментов, определённые анализатором | ts_token_type(3722) | (1,asciiword,"Word, all ASCII") ...
ts_stat(sql_запрос text, [веса text,] OUT слово text, OUT число_док integer, OUT число_вхожд integer) | setof record | получает статистику столбца tsvector | ts_stat('SELECT vector from apod') | (foo,10,15) ...


12.10. Поддержка psql

Информацию об объектах конфигурации текстового поиска можно получить в psql с помощью следующего набора команд:

\dF{d,p,t}[+] [ШАБЛОН]

Необязательный + в этих командах включает более подробный вывод.

В необязательном параметре ШАБЛОН может указываться имя объекта текстового поиска (возможно, дополненное схемой). Если ШАБЛОН не указан, выводится информация обо всех видимых объектах. ШАБЛОН может содержать регулярное выражение с разными масками для схемы и объекта. Это иллюстрируют следующие примеры:

=> \dF *fulltext*
       List of text search configurations
 Schema |  Name        | Description
--------+--------------+-------------
 public | fulltext_cfg |

=> \dF *.fulltext*
       List of text search configurations
 Schema   |  Name        | Description
----------+----------------------------
 fulltext | fulltext_cfg |
 public   | fulltext_cfg |

Возможны следующие команды:

\dF[+] [ШАБЛОН]

Список конфигураций текстового поиска (добавьте + для дополнительных сведений).

=> \dF russian
            List of text search configurations
   Schema   |  Name   |            Description
------------+---------+------------------------------------
 pg_catalog | russian | configuration for russian language

=> \dF+ russian
Text search configuration "pg_catalog.russian"
Parser: "pg_catalog.default"
      Token      | Dictionaries
-----------------+--------------
 asciihword      | english_stem
 asciiword       | english_stem
 email           | simple
 file            | simple
 float           | simple
 host            | simple
 hword           | russian_stem
 hword_asciipart | english_stem
 hword_numpart   | simple
 hword_part      | russian_stem
 int             | simple
 numhword        | simple
 numword         | simple
 sfloat          | simple
 uint            | simple
 url             | simple
 url_path        | simple
 version         | simple
 word            | russian_stem
\dFd[+] [ШАБЛОН]

Список словарей текстового поиска (добавьте + для дополнительных сведений).

=> \dFd
                             List of text search dictionaries
   Schema   |      Name       |                        Description
------------+-----------------+-----------------------------------------------------------
 pg_catalog | arabic_stem     | snowball stemmer for arabic language
 pg_catalog | danish_stem     | snowball stemmer for danish language
 pg_catalog | dutch_stem      | snowball stemmer for dutch language
 pg_catalog | english_stem    | snowball stemmer for english language
 pg_catalog | finnish_stem    | snowball stemmer for finnish language
 pg_catalog | french_stem     | snowball stemmer for french language
 pg_catalog | german_stem     | snowball stemmer for german language
 pg_catalog | hungarian_stem  | snowball stemmer for hungarian language
 pg_catalog | indonesian_stem | snowball stemmer for indonesian language
 pg_catalog | irish_stem      | snowball stemmer for irish language
 pg_catalog | italian_stem    | snowball stemmer for italian language
 pg_catalog | lithuanian_stem | snowball stemmer for lithuanian language
 pg_catalog | nepali_stem     | snowball stemmer for nepali language
 pg_catalog | norwegian_stem  | snowball stemmer for norwegian language
 pg_catalog | portuguese_stem | snowball stemmer for portuguese language
 pg_catalog | romanian_stem   | snowball stemmer for romanian language
 pg_catalog | russian_stem    | snowball stemmer for russian language
 pg_catalog | simple          | simple dictionary: just lower case and check for stopword
 pg_catalog | spanish_stem    | snowball stemmer for spanish language
 pg_catalog | swedish_stem    | snowball stemmer for swedish language
 pg_catalog | tamil_stem      | snowball stemmer for tamil language
 pg_catalog | turkish_stem    | snowball stemmer for turkish language
\dFp[+] [ШАБЛОН]

Список анализаторов текстового поиска (добавьте + для дополнительных сведений).

=> \dFp
        List of text search parsers
   Schema   |  Name   |     Description
------------+---------+---------------------
 pg_catalog | default | default word parser
=> \dFp+
    Text search parser "pg_catalog.default"
     Method      |    Function    | Description
-----------------+----------------+-------------
 Start parse     | prsd_start     |
 Get next token  | prsd_nexttoken |
 End parse       | prsd_end       |
 Get headline    | prsd_headline  |
 Get token types | prsd_lextype   |

        Token types for parser "pg_catalog.default"
   Token name    |               Description
-----------------+------------------------------------------
 asciihword      | Hyphenated word, all ASCII
 asciiword       | Word, all ASCII
 blank           | Space symbols
 email           | Email address
 entity          | XML entity
 file            | File or path name
 float           | Decimal notation
 host            | Host
 hword           | Hyphenated word, all letters
 hword_asciipart | Hyphenated word part, all ASCII
 hword_numpart   | Hyphenated word part, letters and digits
 hword_part      | Hyphenated word part, all letters
 int             | Signed integer
 numhword        | Hyphenated word, letters and digits
 numword         | Word, letters and digits
 protocol        | Protocol head
 sfloat          | Scientific notation
 tag             | XML tag
 uint            | Unsigned integer
 url             | URL
 url_path        | URL path
 version         | Version number
 word            | Word, all letters
(23 rows)
\dFt[+] [ШАБЛОН]

Список шаблонов текстового поиска (добавьте + для дополнительных сведений).

=> \dFt
                           List of text search templates
  Schema  |  Name   |                       Description
----------+---------+----------------------------------------------------
pg_catalog|ispell   |ispell dictionary
pg_catalog|simple   |simple dictionary: just lower case and check for ...
pg_catalog|snowball |snowball stemmer
pg_catalog|synonym  |synonym dictionary: replace word by its synonym
pg_catalog|thesaurus|thesaurus dictionary: phrase by phrase substitution


19.18. Краткие аргументы

Для удобства с некоторыми параметрами сопоставлены однобуквенные аргументы командной строки. Все они описаны в Таблице 19.3. Некоторые из этих сопоставлений существуют по историческим причинам, так что наличие однобуквенного синонима не обязательно является признаком того, что этот аргумент часто используется.

Таблица 19.3. Ключ краткого аргумента

Краткий аргумент | Эквивалент
-B x | shared_buffers = x
-d x | log_min_messages = DEBUGx
-e | datestyle = euro
-fb, -fh, -fi, -fm, -fn, -fo, -fs, -ft | enable_bitmapscan = off, enable_hashjoin = off, enable_indexscan = off, enable_mergejoin = off, enable_nestloop = off, enable_indexonlyscan = off, enable_seqscan = off, enable_tidscan = off
-F | fsync = off
-h x | listen_addresses = x
-i | listen_addresses = '*'
-k x | unix_socket_directories = x
-l | ssl = on
-N x | max_connections = x
-O | allow_system_table_mods = on
-p x | port = x
-P | ignore_system_indexes = on
-s | log_statement_stats = on
-S x | work_mem = x
-tpa, -tpl, -te | log_parser_stats = on, log_planner_stats = on, log_executor_stats = on
-W x | post_auth_delay = x


Часть IV. Клиентские интерфейсы

В этой части документации описываются клиентские программные интерфейсы, включённые в дистрибутив PostgreSQL. Все включённые в неё главы можно читать по отдельности. Заметьте, что существует множество других программных интерфейсов, со своей документацией (некоторые наиболее популярные перечислены в Приложении H). Для изучения этой части нужно уметь работать с базой данных, используя команды SQL (см. Часть II), и, конечно же, знать язык программирования, на который ориентирован определённый интерфейс.

Содержание

33. libpq — библиотека для языка C
33.1. Функции управления подключением к базе данных
33.1.1. Строки параметров подключения
33.1.2. Ключевые слова-параметры
33.2. Функции, описывающие текущее состояние подключения
33.3. Функции для исполнения команд
33.3.1. Главные функции
33.3.2. Извлечение информации, связанной с результатом запроса
33.3.3. Получение другой информации о результате
33.3.4. Экранирование строковых значений для включения в SQL-команды
33.4. Асинхронная обработка команд
33.5. Построчное извлечение результатов запроса
33.6. Отмена запросов в процессе выполнения
33.7. Интерфейс быстрого пути
33.8. Асинхронное уведомление
33.9. Функции, связанные с командой COPY
33.9.1. Функции для передачи данных COPY
33.9.2. Функции для приёма данных COPY
33.9.3. Устаревшие функции для COPY
33.10. Функции управления
33.11. Функции разного назначения
33.12. Обработка замечаний
33.13. Система событий
33.13.1. Типы событий
33.13.2. Процедура обработки событий
33.13.3. Функции поддержки событий
33.13.4. Пример обработки событий
33.14. Переменные окружения
33.15. Файл паролей
33.16. Файл соединений служб
33.17. Получение параметров соединения через LDAP
33.18. Поддержка SSL
33.18.1. Проверка сертификатов сервера на стороне клиента
33.18.2. Клиентские сертификаты
33.18.3. Защита, обеспечиваемая в различных режимах
33.18.4. Файлы, используемые клиентом SSL
33.18.5. Инициализация библиотеки SSL
33.19. Поведение в многопоточных программах
33.20. Сборка программ с libpq
33.21. Примеры программ
34. Большие объекты
34.1. Введение
34.2. Особенности реализации
34.3. Клиентские интерфейсы
34.3.1. Создание большого объекта
34.3.2. Импорт большого объекта
34.3.3. Экспорт большого объекта
34.3.4. Открытие существующего большого объекта
34.3.5. Запись данных в большой объект
34.3.6. Чтение данных из большого объекта
34.3.7. Перемещение в большом объекте
34.3.8. Получение текущего положения в большом объекте
34.3.9. Усечение большого объекта
34.3.10. Закрытие дескриптора большого объекта
34.3.11. Удаление большого объекта
34.4. Серверные функции
34.5. Пример программы
35. ECPG — встраиваемый SQL в C
35.1. Концепция
35.2. Управление подключениями к базе данных
35.2.1. Подключение к серверу баз данных
35.2.2. Выбор подключения
35.2.3. Закрытие подключения
35.3. Запуск команд SQL
35.3.1. Выполнение SQL-операторов
35.3.2. Использование курсоров
35.3.3. Управление транзакциями
35.3.4. Подготовленные операторы
35.4. Использование переменных среды
35.4.1. Обзор
35.4.2. Секции объявлений
35.4.3. Получение результатов запроса
35.4.4. Сопоставление типов
35.4.5. Обработка непримитивных типов данных SQL
35.4.6. Индикаторы
35.5. Динамический SQL
35.5.1. Выполнение операторов без набора результатов
35.5.2. Выполнение оператора с входными параметрами
35.5.3. Выполнение оператора с набором результатов
35.6. Библиотека pgtypes
35.6.1. Символьные строки
35.6.2. Тип numeric
35.6.3. Тип date
35.6.4. Тип timestamp
35.6.5. Тип interval
35.6.6. Тип decimal
35.6.7. Значения errno, которые устанавливает pgtypeslib
35.6.8. Специальные константы pgtypeslib
35.7. Использование областей дескрипторов
35.7.1. Именованные области SQL-дескрипторов
35.7.2. Области дескрипторов SQLDA
35.8. Обработка ошибок
35.8.1. Установка обработчиков
35.8.2. sqlca
35.8.3. SQLSTATE и SQLCODE
35.9. Директивы препроцессора
35.9.1. Включение файлов
35.9.2. Директивы define и undef
35.9.3. Директивы ifdef, ifndef, else, elif и endif
35.10. Компиляция программ со встраиваемым SQL
35.11. Библиотечные функции
35.12. Большие объекты
35.13. Приложения на C++
35.13.1. Область видимости переменных среды
35.13.2. Разработка приложения на C++ с внешним модулем на C
35.14. Команды встраиваемого SQL
35.15. Режим совместимости с Informix
35.15.1. Дополнительные типы
35.15.2. Дополнительные/недостающие операторы встраиваемого SQL
35.15.3. Области дескрипторов SQLDA, совместимые с Informix
35.15.4. Дополнительные функции
35.15.5. Дополнительные константы
35.16. Режим совместимости с Oracle
35.17. Внутреннее устройство
36. Информационная схема
36.1. Схема
36.2. Типы данных
36.3. information_schema_catalog_name
36.4. administrable_role_authorizations
36.5. applicable_roles
36.6. attributes
36.7. character_sets
36.8. check_constraint_routine_usage
36.9. check_constraints
36.10. collations
36.11. collation_character_set_applicability
36.12. column_column_usage
36.13. column_domain_usage
36.14. column_options
36.15. column_privileges
36.16. column_udt_usage
36.17. columns
36.18. constraint_column_usage
36.19. constraint_table_usage
36.20. data_type_privileges
36.21. domain_constraints
36.22. domain_udt_usage
36.23. domains
36.24. element_types
36.25. enabled_roles
36.26. foreign_data_wrapper_options
36.27. foreign_data_wrappers
36.28. foreign_server_options
36.29. foreign_servers
36.30. foreign_table_options
36.31. foreign_tables
36.32. key_column_usage
36.33. parameters
36.34. referential_constraints
36.35. role_column_grants
36.36. role_routine_grants
36.37. role_table_grants
36.38. role_udt_grants
36.39. role_usage_grants
36.40. routine_privileges
36.41. routines
36.42. schemata
36.43. sequences
36.44. sql_features
36.45. sql_implementation_info
36.46. sql_languages
36.47. sql_packages
36.48. sql_parts
36.49. sql_sizing
36.50. sql_sizing_profiles
36.51. table_constraints
36.52. table_privileges
36.53. tables
36.54. transforms
36.55. triggered_update_columns
36.56. triggers
36.57. udt_privileges
36.58. usage_privileges
36.59. user_defined_types
36.60. user_mapping_options
36.61. user_mappings
36.62. view_column_usage
36.63. view_routine_usage
36.64. view_table_usage
36.65. views


33.21. Примеры программ

Эти и другие примеры можно найти в каталоге src/test/examples в дистрибутиве исходного кода.

Пример 33.1. Первая программа, демонстрирующая использование libpq

/*
 * src/test/examples/testlibpq.c
 *
 *
 * testlibpq.c
 *
 *      Test the C version of libpq, the PostgreSQL frontend library.
 */
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

int
main(int argc, char **argv)
{
    const char *conninfo;
    PGconn     *conn;
    PGresult   *res;
    int         nFields;
    int         i,
                j;

    /*
     * If the user supplies a parameter on the command line, use it as the
     * conninfo string; otherwise default to setting dbname=postgres and using
     * environment variables or defaults for all other connection parameters.
     */
    if (argc > 1)
        conninfo = argv[1];
    else
        conninfo = "dbname = postgres";

    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);

    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    /* Set always-secure search path, so malicious users can't take control. */
    res = PQexec(conn,
                 "SELECT pg_catalog.set_config('search_path', '', false)");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "SET failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    /*
     * Should PQclear PGresult whenever it is no longer needed to avoid memory
     * leaks
     */
    PQclear(res);

    /*
     * Our test case here involves using a cursor, for which we must be inside
     * a transaction block.  We could do the whole thing with a single
     * PQexec() of "select * from pg_database", but that's too trivial to make
     * a good example.
     */

    /* Start a transaction block */
    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    /*
     * Fetch rows from pg_database, the system catalog of databases
     */
    res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    res = PQexec(conn, "FETCH ALL in myportal");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    /* first, print out the attribute names */
    nFields = PQnfields(res);
    for (i = 0; i < nFields; i++)
        printf("%-15s", PQfname(res, i));
    printf("\n\n");

    /* next, print out the rows */
    for (i = 0; i < PQntuples(res); i++)
    {
        for (j = 0; j < nFields; j++)
            printf("%-15s", PQgetvalue(res, i, j));
        printf("\n");
    }

    PQclear(res);

    /* close the portal ... we don't bother to check for errors ... */
    res = PQexec(conn, "CLOSE myportal");
    PQclear(res);

    /* end the transaction */
    res = PQexec(conn, "END");
    PQclear(res);

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}

Пример 33.2. Вторая программа, демонстрирующая использование libpq

/*
 * src/test/examples/testlibpq2.c
 *
 *
 * testlibpq2.c
 *      Test of the asynchronous notification interface
 *
 * Start this program, then from psql in another window do
 *   NOTIFY TBL2;
 * Repeat four times to get this program to exit.
 *
 * Or, if you want to get fancy, try this:
 * populate a database with the following commands
 * (provided in src/test/examples/testlibpq2.sql):
 *
 *   CREATE SCHEMA TESTLIBPQ2;
 *   SET search_path = TESTLIBPQ2;
 *   CREATE TABLE TBL1 (i int4);
 *   CREATE TABLE TBL2 (i int4);
 *   CREATE RULE r1 AS ON INSERT TO TBL1 DO
 *     (INSERT INTO TBL2 VALUES (new.i); NOTIFY TBL2);
 *
 * Start this program, then from psql do this four times:
 *
 *   INSERT INTO TESTLIBPQ2.TBL1 VALUES (10);
 */

#ifdef WIN32
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif

#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

int
main(int argc, char **argv)
{
    const char *conninfo;
    PGconn     *conn;
    PGresult   *res;
    PGnotify   *notify;
    int         nnotifies;

    /*
     * If the user supplies a parameter on the command line, use it as the
     * conninfo string; otherwise default to setting dbname=postgres and using
     * environment variables or defaults for all other connection parameters.
     */
    if (argc > 1)
        conninfo = argv[1];
    else
        conninfo = "dbname = postgres";

    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);

    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    /* Set always-secure search path, so malicious users can't take control. */
    res = PQexec(conn,
                 "SELECT pg_catalog.set_config('search_path', '', false)");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "SET failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    /*
     * Should PQclear PGresult whenever it is no longer needed to avoid memory
     * leaks
     */
    PQclear(res);

    /*
     * Issue LISTEN command to enable notifications from the rule's NOTIFY.
     */
    res = PQexec(conn, "LISTEN TBL2");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "LISTEN command failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    /* Quit after four notifies are received. */
    nnotifies = 0;
    while (nnotifies < 4)
    {
        /*
         * Sleep until something happens on the connection.  We use select(2)
         * to wait for input, but you could also use poll() or similar
         * facilities.
         */
        int         sock;
        fd_set      input_mask;

        sock = PQsocket(conn);

        if (sock < 0)
            break;              /* shouldn't happen */

        FD_ZERO(&input_mask);
        FD_SET(sock, &input_mask);

        if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0)
        {
            fprintf(stderr, "select() failed: %s\n", strerror(errno));
            exit_nicely(conn);
        }

        /* Now check for input */
        PQconsumeInput(conn);
        while ((notify = PQnotifies(conn)) != NULL)
        {
            fprintf(stderr,
                    "ASYNC NOTIFY of '%s' received from backend PID %d\n",
                    notify->relname, notify->be_pid);
            PQfreemem(notify);
            nnotifies++;
            PQconsumeInput(conn);
        }
    }

    fprintf(stderr, "Done.\n");

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}

Пример 33.3. Третья программа, демонстрирующая использование libpq

/*
 * src/test/examples/testlibpq3.c
 *
 *
 * testlibpq3.c
 *      Test out-of-line parameters and binary I/O.
 *
 * Before running this, populate a database with the following commands
 * (provided in src/test/examples/testlibpq3.sql):
 *
 * CREATE SCHEMA testlibpq3;
 * SET search_path = testlibpq3;
 * CREATE TABLE test1 (i int4, t text, b bytea);
 * INSERT INTO test1 values (1, 'joe''s place', '\\000\\001\\002\\003\\004');
 * INSERT INTO test1 values (2, 'ho there', '\\004\\003\\002\\001\\000');
 *
 * The expected output is:
 *
 * tuple 0: got
 *  i = (4 bytes) 1
 *  t = (11 bytes) 'joe's place'
 *  b = (5 bytes) \000\001\002\003\004
 *
 * tuple 0: got
 *  i = (4 bytes) 2
 *  t = (8 bytes) 'ho there'
 *  b = (5 bytes) \004\003\002\001\000
 */

#ifdef WIN32
#include <windows.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"

/* for ntohl/htonl */
#include <netinet/in.h>
#include <arpa/inet.h>

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

/*
 * This function prints a query result that is a binary-format fetch from
 * a table defined as in the comment above.  We split it out because the
 * main() function uses it twice.
 */
static void
show_binary_results(PGresult *res)
{
    int         i,
                j;
    int         i_fnum,
                t_fnum,
                b_fnum;

    /* Use PQfnumber to avoid assumptions about field order in result */
    i_fnum = PQfnumber(res, "i");
    t_fnum = PQfnumber(res, "t");
    b_fnum = PQfnumber(res, "b");

    for (i = 0; i < PQntuples(res); i++)
    {
        char       *iptr;
        char       *tptr;
        char       *bptr;
        int         blen;
        int         ival;

        /* Get the field values (we ignore possibility they are null!) */
        iptr = PQgetvalue(res, i, i_fnum);
        tptr = PQgetvalue(res, i, t_fnum);
        bptr = PQgetvalue(res, i, b_fnum);

        /*
         * The binary representation of INT4 is in network byte order, which
         * we'd better coerce to the local byte order.
         */
        ival = ntohl(*((uint32_t *) iptr));

        /*
         * The binary representation of TEXT is, well, text, and since libpq
         * was nice enough to append a zero byte to it, it'll work just fine
         * as a C string.
         *
         * The binary representation of BYTEA is a bunch of bytes, which could
         * include embedded nulls so we have to pay attention to field length.
         */
        blen = PQgetlength(res, i, b_fnum);

        printf("tuple %d: got\n", i);
        printf(" i = (%d bytes) %d\n",
               PQgetlength(res, i, i_fnum), ival);
        printf(" t = (%d bytes) '%s'\n",
               PQgetlength(res, i, t_fnum), tptr);
        printf(" b = (%d bytes) ", blen);
        for (j = 0; j < blen; j++)
            printf("\\%03o", bptr[j]);
        printf("\n\n");
    }
}

int
main(int argc, char **argv)
{
    const char *conninfo;
    PGconn     *conn;
    PGresult   *res;
    const char *paramValues[1];
    int         paramLengths[1];
    int         paramFormats[1];
    uint32_t    binaryIntVal;

    /*
     * If the user supplies a parameter on the command line, use it as the
     * conninfo string; otherwise default to setting dbname=postgres and using
     * environment variables or defaults for all other connection parameters.
     */
    if (argc > 1)
        conninfo = argv[1];
    else
        conninfo = "dbname = postgres";

    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);

    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    /* Set always-secure search path, so malicious users can't take control. */
    res = PQexec(conn, "SET search_path = testlibpq3");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "SET failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    /*
     * The point of this program is to illustrate use of PQexecParams() with
     * out-of-line parameters, as well as binary transmission of data.
     *
     * This first example transmits the parameters as text, but receives the
     * results in binary format.  By using out-of-line parameters we can avoid
     * a lot of tedious mucking about with quoting and escaping, even though
     * the data is text.  Notice how we don't have to do anything special with
     * the quote mark in the parameter value.
     */

    /* Here is our out-of-line parameter value */
    paramValues[0] = "joe's place";

    res = PQexecParams(conn,
                       "SELECT * FROM test1 WHERE t = $1",
                       1,       /* one param */
                       NULL,    /* let the backend deduce param type */
                       paramValues,
                       NULL,    /* don't need param lengths since text */
                       NULL,    /* default to all text params */
                       1);      /* ask for binary results */

    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    show_binary_results(res);

    PQclear(res);

    /*
     * In this second example we transmit an integer parameter in binary form,
     * and again retrieve the results in binary form.
     *
     * Although we tell PQexecParams we are letting the backend deduce
     * parameter type, we really force the decision by casting the parameter
     * symbol in the query text.  This is a good safety measure when sending
     * binary parameters.
     */

    /* Convert integer value "2" to network byte order */
    binaryIntVal = htonl((uint32_t) 2);

    /* Set up parameter arrays for PQexecParams */
    paramValues[0] = (char *) &binaryIntVal;
    paramLengths[0] = sizeof(binaryIntVal);
    paramFormats[0] = 1;        /* binary */

    res = PQexecParams(conn,
                       "SELECT * FROM test1 WHERE i = $1::int4",
                       1,       /* one param */
                       NULL,    /* let the backend deduce param type */
                       paramValues,
                       paramLengths,
                       paramFormats,
                       1);      /* ask for binary results */

    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    show_binary_results(res);

    PQclear(res);

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}


34.5. Пример программы

В Примере 34.1 представлена пробная программа, демонстрирующая использование интерфейса больших объектов в libpq. Части этой программы закомментированы, но оставлены в тексте для читателя. Эту программу также можно найти в src/test/examples/testlo.c в дистрибутиве исходного кода.

Пример 34.1. Пример использования больших объектов с применением libpq

/*-------------------------------------------------------------------------
 *
 * testlo.c
 *    test using large objects with libpq
 *
 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *    src/test/examples/testlo.c
 *
 *-------------------------------------------------------------------------
 */
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include "libpq-fe.h"
#include "libpq/libpq-fs.h"

#define BUFSIZE         1024

/*
 * importFile -
 *    import file "in_filename" into database as large object "lobjOid"
 *
 */
static Oid
importFile(PGconn *conn, char *filename)
{
    Oid         lobjId;
    int         lobj_fd;
    char        buf[BUFSIZE];
    int         nbytes,
                tmp;
    int         fd;

    /*
     * open the file to be read in
     */
    fd = open(filename, O_RDONLY, 0666);
    if (fd < 0)
    {                           /* error */
        fprintf(stderr, "cannot open unix file\"%s\"\n", filename);
    }

    /*
     * create the large object
     */
    lobjId = lo_creat(conn, INV_READ | INV_WRITE);
    if (lobjId == 0)
        fprintf(stderr, "cannot create large object");

    lobj_fd = lo_open(conn, lobjId, INV_WRITE);

    /*
     * read in from the Unix file and write to the inversion file
     */
    while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
    {
        tmp = lo_write(conn, lobj_fd, buf, nbytes);
        if (tmp < nbytes)
            fprintf(stderr, "error while reading \"%s\"", filename);
    }

    close(fd);
    lo_close(conn, lobj_fd);

    return lobjId;
}

static void
pickout(PGconn *conn, Oid lobjId, int start, int len)
{
    int         lobj_fd;
    char       *buf;
    int         nbytes;
    int         nread;

    lobj_fd = lo_open(conn, lobjId, INV_READ);
    if (lobj_fd < 0)
        fprintf(stderr, "cannot open large object %u", lobjId);

    lo_lseek(conn, lobj_fd, start, SEEK_SET);
    buf = malloc(len + 1);

    nread = 0;
    while (len - nread > 0)
    {
        nbytes = lo_read(conn, lobj_fd, buf, len - nread);
        buf[nbytes] = '\0';
        fprintf(stderr, ">>> %s", buf);
        nread += nbytes;
        if (nbytes <= 0)
            break;              /* no more data? */
    }
    free(buf);
    fprintf(stderr, "\n");
    lo_close(conn, lobj_fd);
}

static void
overwrite(PGconn *conn, Oid lobjId, int start, int len)
{
    int         lobj_fd;
    char       *buf;
    int         nbytes;
    int         nwritten;
    int         i;

    lobj_fd = lo_open(conn, lobjId, INV_WRITE);
    if (lobj_fd < 0)
        fprintf(stderr, "cannot open large object %u", lobjId);

    lo_lseek(conn, lobj_fd, start, SEEK_SET);
    buf = malloc(len + 1);

    for (i = 0; i < len; i++)
        buf[i] = 'X';
    buf[i] = '\0';

    nwritten = 0;
    while (len - nwritten > 0)
    {
        nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);
        nwritten += nbytes;
        if (nbytes <= 0)
        {
            fprintf(stderr, "\nWRITE FAILED!\n");
            break;
        }
    }
    free(buf);
    fprintf(stderr, "\n");
    lo_close(conn, lobj_fd);
}

/*
 * exportFile -
 *    export large object "lobjOid" to file "out_filename"
 *
 */
static void
exportFile(PGconn *conn, Oid lobjId, char *filename)
{
    int         lobj_fd;
    char        buf[BUFSIZE];
    int         nbytes,
                tmp;
    int         fd;

    /*
     * open the large object
     */
    lobj_fd = lo_open(conn, lobjId, INV_READ);
    if (lobj_fd < 0)
        fprintf(stderr, "cannot open large object %u", lobjId);

    /*
     * open the file to be written to
     */
    fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
    if (fd < 0)
    {                           /* error */
        fprintf(stderr, "cannot open unix file\"%s\"",
                filename);
    }

    /*
     * read in from the inversion file and write to the Unix file
     */
    while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
    {
        tmp = write(fd, buf, nbytes);
        if (tmp < nbytes)
        {
            fprintf(stderr, "error while writing \"%s\"",
                    filename);
        }
    }

    lo_close(conn, lobj_fd);
    close(fd);

    return;
}

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

int
main(int argc, char **argv)
{
    char       *in_filename,
               *out_filename;
    char       *database;
    Oid         lobjOid;
    PGconn     *conn;
    PGresult   *res;

    if (argc != 4)
    {
        fprintf(stderr, "Usage: %s database_name in_filename out_filename\n",
                argv[0]);
        exit(1);
    }

    database = argv[1];
    in_filename = argv[2];
    out_filename = argv[3];

    /*
     * set up the connection
     */
    conn = PQsetdb(NULL, NULL, NULL, NULL, database);

    /* check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    /* Set always-secure search path, so malicious users can't take control. */
    res = PQexec(conn,
                 "SELECT pg_catalog.set_config('search_path', '', false)");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "SET failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    res = PQexec(conn, "begin");
    PQclear(res);
    printf("importing file \"%s\" ...\n", in_filename);
/*  lobjOid = importFile(conn, in_filename); */
    lobjOid = lo_import(conn, in_filename);
    if (lobjOid == 0)
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
    else
    {
        printf("\tas large object %u.\n", lobjOid);

        printf("picking out bytes 1000-2000 of the large object\n");
        pickout(conn, lobjOid, 1000, 1000);

        printf("overwriting bytes 1000-2000 of the large object with X's\n");
        overwrite(conn, lobjOid, 1000, 1000);

        printf("exporting large object to file \"%s\" ...\n", out_filename);
/*      exportFile(conn, lobjOid, out_filename); */
        if (lo_export(conn, lobjOid, out_filename) < 0)
            fprintf(stderr, "%s\n", PQerrorMessage(conn));
    }

    res = PQexec(conn, "end");
    PQclear(res);
    PQfinish(conn);
    return 0;
}


DEALLOCATE DESCRIPTOR

DEALLOCATE DESCRIPTOR — освободить область SQL-дескриптора

Синтаксис

DEALLOCATE DESCRIPTOR имя

Описание

DEALLOCATE DESCRIPTOR освобождает область именованного SQL-дескриптора.

Параметры

имя

Имя дескриптора, подлежащего освобождению, задаётся с учётом регистра. Это может быть идентификатор SQL или переменная среды C.

Примеры

EXEC SQL DEALLOCATE DESCRIPTOR mydesc;

Совместимость

Команда DEALLOCATE DESCRIPTOR описана в стандарте SQL.

См. также

ALLOCATE DESCRIPTOR, GET DESCRIPTOR, SET DESCRIPTOR


TYPE

TYPE — создать новый тип данных

Синтаксис

TYPE имя_типа IS тип_С

Описание

Команда TYPE определяет новый тип C. Она равнозначна добавлению typedef в секции объявлений.

Эта команда принимается, только когда ecpg запускается с параметром -c.

Параметры

имя_типа

Имя нового типа. Это имя должно быть допустимым для типа в языке C.

тип_С

Определение типа C.

Примеры

EXEC SQL TYPE customer IS
    struct
    {
        varchar name[50];
        int     phone;
    };

EXEC SQL TYPE cust_ind IS
    struct ind
    {
        short   name_ind;
        short   phone_ind;
    };

EXEC SQL TYPE c IS char reference;
EXEC SQL TYPE ind IS union { int integer; short smallint; };
EXEC SQL TYPE intarray IS int[AMOUNT];
EXEC SQL TYPE str IS varchar[BUFFERSIZ];
EXEC SQL TYPE string IS char[11];

Пример программы, в которой используется EXEC SQL TYPE:

EXEC SQL WHENEVER SQLERROR SQLPRINT;

EXEC SQL TYPE tt IS
    struct
    {
        varchar v[256];
        int     i;
    };

EXEC SQL TYPE tt_ind IS
    struct ind {
        short   v_ind;
        short   i_ind;
    };

int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
    tt t;
    tt_ind t_ind;
EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT TO testdb AS con1;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT;

    EXEC SQL SELECT current_database(), 256 INTO :t:t_ind LIMIT 1;

    printf("t.v = %s\n", t.v.arr);
    printf("t.i = %d\n", t.i);

    printf("t_ind.v_ind = %d\n", t_ind.v_ind);
    printf("t_ind.i_ind = %d\n", t_ind.i_ind);

    EXEC SQL DISCONNECT con1;

    return 0;
}

Эта программа выдаёт следующее:

t.v = testdb
t.i = 256
t_ind.v_ind = 0
t_ind.i_ind = 0

Совместимость

Команда TYPE — расширение PostgreSQL.


Глава 36. Информационная схема

Содержание

36.1. Схема
36.2. Типы данных
36.3. information_schema_catalog_name
36.4. administrable_role_authorizations
36.5. applicable_roles
36.6. attributes
36.7. character_sets
36.8. check_constraint_routine_usage
36.9. check_constraints
36.10. collations
36.11. collation_character_set_applicability
36.12. column_column_usage
36.13. column_domain_usage
36.14. column_options
36.15. column_privileges
36.16. column_udt_usage
36.17. columns
36.18. constraint_column_usage
36.19. constraint_table_usage
36.20. data_type_privileges
36.21. domain_constraints
36.22. domain_udt_usage
36.23. domains
36.24. element_types
36.25. enabled_roles
36.26. foreign_data_wrapper_options
36.27. foreign_data_wrappers
36.28. foreign_server_options
36.29. foreign_servers
36.30. foreign_table_options
36.31. foreign_tables
36.32. key_column_usage
36.33. parameters
36.34. referential_constraints
36.35. role_column_grants
36.36. role_routine_grants
36.37. role_table_grants
36.38. role_udt_grants
36.39. role_usage_grants
36.40. routine_privileges
36.41. routines
36.42. schemata
36.43. sequences
36.44. sql_features
36.45. sql_implementation_info
36.46. sql_languages
36.47. sql_packages
36.48. sql_parts
36.49. sql_sizing
36.50. sql_sizing_profiles
36.51. table_constraints
36.52. table_privileges
36.53. tables
36.54. transforms
36.55. triggered_update_columns
36.56. triggers
36.57. udt_privileges
36.58. usage_privileges
36.59. user_defined_types
36.60. user_mapping_options
36.61. user_mappings
36.62. view_column_usage
36.63. view_routine_usage
36.64. view_table_usage
36.65. views

Информационная схема состоит из набора представлений, содержащих информацию об объектах, определённых в текущей базе данных. Информационная схема описана в стандарте SQL и поэтому можно рассчитывать на её переносимость и стабильность — в отличие от системных каталогов, которые привязаны к PostgreSQL, и моделируются, отталкиваясь от реализации. Представления информационной схемы, однако, не содержат информацию о функциях, присущих исключительно PostgreSQL; чтобы получить информацию о них, необходимо обратиться к системным каталогам или другим специфическим представлениям PostgreSQL.

Примечание

Когда из базы данных запрашивается информация об ограничениях, возможна ситуация, когда соответствующий стандарту запрос, который должен возвращать одну строку, возвращает несколько. Это связано с тем, что стандарт SQL требует, чтобы имена ограничений были уникальными в схеме, но в PostgreSQL такого требования нет. Имена ограничений, которые PostgreSQL генерирует автоматически, не должны дублироваться в одной схеме, но сами пользователи могут назначить подобные дублирующиеся имена.

Эта проблема может проявиться при обращении к таким представлениям информационной схемы, как check_constraint_routine_usage, check_constraints, domain_constraints и referential_constraints. В некоторых других представлениях она могла бы тоже иметь место, но они содержат имя таблицы, помогающее различить дублирующиеся строки, например: constraint_column_usage, constraint_table_usage, table_constraints.

36.1. Схема

Информационная схема сама по себе — это схема с именем information_schema. Данная схема автоматически доступна во всех базах данных. Владельцем этой схемы является начальный пользователь баз данных в кластере, и этот пользователь, естественно, имеет все права в ней, включая возможность её удалить (хотя достигаемая при этом экономия пространства минимальна).

По умолчанию информационная схема отсутствует в пути поиска схем, так что ко всем объектам в ней нужно обращаться по полным именам. Так как имена некоторых объектов в информационной схеме довольно распространённые и могут встречаться и в пользовательских приложениях, будьте осторожны, добавляя информационную схему в путь поиска.


36.3. information_schema_catalog_name

Таблица information_schema_catalog_name всегда содержит одну строку и один столбец с именем текущей базы данных (текущий каталог, в терминологии SQL).

Таблица 36.1. Столбцы information_schema_catalog_name

Имя | Тип данных | Описание
catalog_name | sql_identifier | Имя базы данных, содержащей эту информационную схему


36.4. administrable_role_authorizations

Представление administrable_role_authorizations описывает все роли, для которых текущий пользователь является администратором.

Таблица 36.2. Столбцы administrable_role_authorizations

Имя | Тип данных | Описание
grantee | sql_identifier | Имя роли, которой было разрешено участие в целевой роли (может быть текущий пользователь, либо другая роль, в случае вложенного членства)
role_name | sql_identifier | Имя целевой роли
is_grantable | yes_or_no | Всегда YES


36.10. collations

Представление collations показывает правила сортировки, доступные в текущей базе данных.

Таблица 36.8. Столбцы collations

Имя | Тип данных | Описание
collation_catalog | sql_identifier | Имя базы данных, содержащей правило сортировки (всегда текущая база)
collation_schema | sql_identifier | Имя схемы, содержащей правило сортировки
collation_name | sql_identifier | Имя правила сортировки
pad_attribute | character_data | Всегда NO PAD (Альтернативный вариант PAD SPACE в PostgreSQL не поддерживается.)


38.4. Полный пример триггера

Вот очень простой пример триггерной функции, написанной на C. (Примеры триггеров для процедурных языков могут быть найдены в документации на процедурные языки.)

Функция trigf сообщает количество строк в таблице ttest и пропускает операцию для строки при попытке вставить пустое значение в столбец x. (Таким образом, триггер действует как ограничение NOT NULL, но не прерывает транзакцию.)

Вначале определение таблицы:

CREATE TABLE ttest (
    x integer
);

Теперь исходный код триггерной функции:

#include "postgres.h"
#include "fmgr.h"
#include "executor/spi.h"       /* this is what you need to work with SPI */
#include "commands/trigger.h"   /* ... triggers ... */
#include "utils/rel.h"          /* ... and relations */

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(trigf);

Datum
trigf(PG_FUNCTION_ARGS)
{
    TriggerData *trigdata = (TriggerData *) fcinfo->context;
    TupleDesc   tupdesc;
    HeapTuple   rettuple;
    char       *when;
    bool        checknull = false;
    bool        isnull;
    int         ret, i;

    /* make sure it's called as a trigger at all */
    if (!CALLED_AS_TRIGGER(fcinfo))
        elog(ERROR, "trigf: not called by trigger manager");

    /* tuple to return to executor */
    if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
        rettuple = trigdata->tg_newtuple;
    else
        rettuple = trigdata->tg_trigtuple;

    /* check for null values */
    if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)
        && TRIGGER_FIRED_BEFORE(trigdata->tg_event))
        checknull = true;

    if (TRIGGER_FIRED_BEFORE(trigdata->tg_event))
        when = "before";
    else
        when = "after ";

    tupdesc = trigdata->tg_relation->rd_att;

    /* connect to SPI manager */
    if ((ret = SPI_connect()) < 0)
        elog(ERROR, "trigf (fired %s): SPI_connect returned %d", when, ret);

    /* get number of rows in table */
    ret = SPI_exec("SELECT count(*) FROM ttest", 0);

    if (ret < 0)
        elog(ERROR, "trigf (fired %s): SPI_exec returned %d", when, ret);

    /* count(*) returns int8, so be careful to convert */
    i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0],
                                    SPI_tuptable->tupdesc,
                                    1,
                                    &isnull));

    elog (INFO, "trigf (fired %s): there are %d rows in ttest", when, i);

    SPI_finish();

    if (checknull)
    {
        SPI_getbinval(rettuple, tupdesc, 1, &isnull);
        if (isnull)
            rettuple = NULL;
    }

    return PointerGetDatum(rettuple);
}

После компиляции исходного кода (см. Подраздел 37.10.5) объявляем функцию и триггеры:

CREATE FUNCTION trigf() RETURNS trigger
    AS 'имя_файла'
    LANGUAGE C;

CREATE TRIGGER tbefore BEFORE INSERT OR UPDATE OR DELETE ON ttest
    FOR EACH ROW EXECUTE FUNCTION trigf();

CREATE TRIGGER tafter AFTER INSERT OR UPDATE OR DELETE ON ttest
    FOR EACH ROW EXECUTE FUNCTION trigf();

Теперь можно проверить работу триггера:

=> INSERT INTO ttest VALUES (NULL);
INFO:  trigf (fired before): there are 0 rows in ttest
INSERT 0 0

-- Вставка записи пропущена (значение NULL), поэтому триггер AFTER не сработал

=> SELECT * FROM ttest;
 x
---
(0 rows)

=> INSERT INTO ttest VALUES (1);
INFO:  trigf (fired before): there are 0 rows in ttest
INFO:  trigf (fired after ): there are 1 rows in ttest
                                       ^^^^^^^^
                             вспомните, что говорилось о видимости
INSERT 167793 1
vac=> SELECT * FROM ttest;
 x
---
 1
(1 row)

=> INSERT INTO ttest SELECT x * 2 FROM ttest;
INFO:  trigf (fired before): there are 1 rows in ttest
INFO:  trigf (fired after ): there are 2 rows in ttest
                                       ^^^^^^
                             вспомните, что говорилось о видимости
INSERT 167794 1
=> SELECT * FROM ttest;
 x
---
 1
 2
(2 rows)

=> UPDATE ttest SET x = NULL WHERE x = 2;
INFO:  trigf (fired before): there are 2 rows in ttest
UPDATE 0
=> UPDATE ttest SET x = 4 WHERE x = 2;
INFO:  trigf (fired before): there are 2 rows in ttest
INFO:  trigf (fired after ): there are 2 rows in ttest
UPDATE 1
vac=> SELECT * FROM ttest;
 x
---
 1
 4
(2 rows)

=> DELETE FROM ttest;
INFO:  trigf (fired before): there are 2 rows in ttest
INFO:  trigf (fired before): there are 1 rows in ttest
INFO:  trigf (fired after ): there are 0 rows in ttest
INFO:  trigf (fired after ): there are 0 rows in ttest
                                       ^^^^^^
                             вспомните, что говорилось о видимости
DELETE 2
=> SELECT * FROM ttest;
 x
---
(0 rows)

Более сложные примеры можно найти в src/test/regress/regress.c и в spi.


39.2. Матрица срабатывания триггеров событий

В Таблице 39.1 перечислены команды, для которых поддерживаются триггеры событий.

Таблица 39.1. Поддержка триггеров событий командами DDL

Тег команды | ddl_command_start | ddl_command_end | sql_drop | table_rewrite | Примечания
ALTER AGGREGATE | X | X | - | - |
ALTER COLLATION | X | X | - | - |
ALTER CONVERSION | X | X | - | - |
ALTER DOMAIN | X | X | - | - |
ALTER DEFAULT PRIVILEGES | X | X | - | - |
ALTER EXTENSION | X | X | - | - |
ALTER FOREIGN DATA WRAPPER | X | X | - | - |
ALTER FOREIGN TABLE | X | X | X | - |
ALTER FUNCTION | X | X | - | - |
ALTER LANGUAGE | X | X | - | - |
ALTER LARGE OBJECT | X | X | - | - |
ALTER MATERIALIZED VIEW | X | X | - | - |
ALTER OPERATOR | X | X | - | - |
ALTER OPERATOR CLASS | X | X | - | - |
ALTER OPERATOR FAMILY | X | X | - | - |
ALTER POLICY | X | X | - | - |
ALTER PROCEDURE | X | X | - | - |
ALTER PUBLICATION | X | X | - | - |
ALTER ROUTINE | X | X | - | - |
ALTER SCHEMA | X | X | - | - |
ALTER SEQUENCE | X | X | - | - |
ALTER SERVER | X | X | - | - |
ALTER STATISTICS | X | X | - | - |
ALTER SUBSCRIPTION | X | X | - | - |
ALTER TABLE | X | X | X | X |
ALTER TEXT SEARCH CONFIGURATION | X | X | - | - |
ALTER TEXT SEARCH DICTIONARY | X | X | - | - |
ALTER TEXT SEARCH PARSER | X | X | - | - |
ALTER TEXT SEARCH TEMPLATE | X | X | - | - |
ALTER TRIGGER | X | X | - | - |
ALTER TYPE | X | X | - | X |
ALTER USER MAPPING | X | X | - | - |
ALTER VIEW | X | X | - | - |
COMMENT | X | X | - | - | Только для локальных объектов
CREATE ACCESS METHOD | X | X | - | - |
CREATE AGGREGATE | X | X | - | - |
CREATE CAST | X | X | - | - |
CREATE COLLATION | X | X | - | - |
CREATE CONVERSION | X | X | - | - |
CREATE DOMAIN | X | X | - | - |
CREATE EXTENSION | X | X | - | - |
CREATE FOREIGN DATA WRAPPER | X | X | - | - |
CREATE FOREIGN TABLE | X | X | - | - |
CREATE FUNCTION | X | X | - | - |
CREATE INDEX | X | X | - | - |
CREATE LANGUAGE | X | X | - | - |
CREATE MATERIALIZED VIEW | X | X | - | - |
CREATE OPERATOR | X | X | - | - |
CREATE OPERATOR CLASS | X | X | - | - |
CREATE OPERATOR FAMILY | X | X | - | - |
CREATE POLICY | X | X | - | - |
CREATE PROCEDURE | X | X | - | - |
CREATE PUBLICATION | X | X | - | - |
CREATE RULE | X | X | - | - |
CREATE SCHEMA | X | X | - | - |
CREATE SEQUENCE | X | X | - | - |
CREATE SERVER | X | X | - | - |
CREATE STATISTICS | X | X | - | - |
CREATE SUBSCRIPTION | X | X | - | - |
CREATE TABLE | X | X | - | - |
CREATE TABLE AS | X | X | - | - |
CREATE TEXT SEARCH CONFIGURATION | X | X | - | - |
CREATE TEXT SEARCH DICTIONARY | X | X | - | - |
CREATE TEXT SEARCH PARSER | X | X | - | - |
CREATE TEXT SEARCH TEMPLATE | X | X | - | - |
CREATE TRIGGER | X | X | - | - |
CREATE TYPE | X | X | - | - |
CREATE USER MAPPING | X | X | - | - |
CREATE VIEW | X | X | - | - |
DROP ACCESS METHOD | X | X | X | - |
DROP AGGREGATE | X | X | X | - |
DROP CAST | X | X | X | - |
DROP COLLATION | X | X | X | - |
DROP CONVERSION | X | X | X | - |
DROP DOMAIN | X | X | X | - |
DROP EXTENSION | X | X | X | - |
DROP FOREIGN DATA WRAPPER | X | X | X | - |
DROP FOREIGN TABLE | X | X | X | - |
DROP FUNCTION | X | X | X | - |
DROP INDEX | X | X | X | - |
DROP LANGUAGE | X | X | X | - |
DROP MATERIALIZED VIEW | X | X | X | - |
DROP OPERATOR | X | X | X | - |
DROP OPERATOR CLASS | X | X | X | - |
DROP OPERATOR FAMILY | X | X | X | - |
DROP OWNED | X | X | X | - |
DROP POLICY | X | X | X | - |
DROP PROCEDURE | X | X | X | - |
DROP PUBLICATION | X | X | X | - |
DROP ROUTINE | X | X | X | - |
DROP RULE | X | X | X | - |
DROP SCHEMA | X | X | X | - |
DROP SEQUENCE | X | X | X | - |
DROP SERVER | X | X | X | - |
DROP STATISTICS | X | X | X | - |
DROP SUBSCRIPTION | X | X | X | - |
DROP TABLE | X | X | X | - |
DROP TEXT SEARCH CONFIGURATION | X | X | X | - |
DROP TEXT SEARCH DICTIONARY | X | X | X | - |
DROP TEXT SEARCH PARSER | X | X | X | - |
DROP TEXT SEARCH TEMPLATE | X | X | X | - |
DROP TRIGGER | X | X | X | - |
DROP TYPE | X | X | X | - |
DROP USER MAPPING | X | X | X | - |
DROP VIEW | X | X | X | - |
GRANT | X | X | - | - | Только для локальных объектов
IMPORT FOREIGN SCHEMA | X | X | - | - |
REFRESH MATERIALIZED VIEW | X | X | - | - |
REVOKE | X | X | - | - | Только для локальных объектов
SECURITY LABEL | X | X | - | - | Только для локальных объектов
SELECT INTO | X | X | - | - |


SPI_exec

SPI_exec — выполнить команду чтения/записи

Синтаксис

int SPI_exec(const char * command, long count)

Описание

SPI_exec действует подобно SPI_execute, но ей не передаётся параметр read_only (всегда подразумевается false).

Аргументы

const char * command

строка с командой, которая должна быть выполнена

long count

максимальное число строк, которое должно быть возвращено; с 0 ограничения нет

Возвращаемое значение

См. SPI_execute.


SPI_gettypeid

SPI_gettypeid — получить OID типа данных указанного столбца

Синтаксис

Oid SPI_gettypeid(TupleDesc rowdesc, int colnumber)

Описание

SPI_gettypeid возвращает OID типа данных указанного столбца.

Аргументы

TupleDesc rowdesc

описание строк

int colnumber

номер столбца (начиная с 1)

Возвращаемое значение

OID типа данных указанного столбца, либо InvalidOid в случае ошибки. При ошибке в SPI_result устанавливается SPI_ERROR_NOATTRIBUTE.


ALTER LANGUAGE

ALTER LANGUAGE — изменить определение процедурного языка

Синтаксис

ALTER [ PROCEDURAL ] LANGUAGE имя RENAME TO новое_имя
ALTER [ PROCEDURAL ] LANGUAGE имя OWNER TO { новый_владелец | CURRENT_USER | SESSION_USER }

Описание

ALTER LANGUAGE изменяет определение процедурного языка. Единственное, что может это команда — переименовать язык или назначить нового владельца. Выполнить ALTER LANGUAGE может только суперпользователь или владелец языка.

Параметры

имя

Имя языка

новое_имя

Новое имя языка

новый_владелец

Новый владелец языка

Совместимость

Оператор ALTER LANGUAGE отсутствует в стандарте SQL.

См. также

CREATE LANGUAGE, DROP LANGUAGE


ALTER USER

ALTER USER — изменить роль в базе данных

Синтаксис

ALTER USER указание_роли [ WITH ] параметр [ ... ]

Здесь параметр:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'

ALTER USER имя RENAME TO новое_имя

ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] SET параметр_конфигурации { TO | = } { значение | DEFAULT }
ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] SET параметр_конфигурации FROM CURRENT
ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] RESET параметр_конфигурации
ALTER USER { указание_роли | ALL } [ IN DATABASE имя_бд ] RESET ALL

Здесь указание_роли:

    имя_роли
  | CURRENT_USER
  | SESSION_USER

Описание

Оператор ALTER USER теперь стал синонимом оператора ALTER ROLE.

Совместимость

Оператор ALTER USER является расширением PostgreSQL. В стандарте SQL определение пользователей считается зависимым от реализации.

См. также

ALTER ROLE


CREATE GROUP

CREATE GROUP — создать роль в базе данных

Синтаксис

CREATE GROUP имя [ [ WITH ] параметр [ ... ] ]

Здесь параметр:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'
    | IN ROLE имя_роли [, ...]
    | IN GROUP имя_роли [, ...]
    | ROLE имя_роли [, ...]
    | ADMIN имя_роли [, ...]
    | USER имя_роли [, ...]
    | SYSID uid

Описание

Оператор CREATE GROUP теперь является синонимом оператора CREATE ROLE.

Совместимость

Оператор CREATE GROUP отсутствует в стандарте SQL.

См. также

CREATE ROLE


CREATE USER

CREATE USER — создать роль в базе данных

Синтаксис

CREATE USER имя [ [ WITH ] параметр [ ... ] ]

Здесь параметр:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT предел_подключений
    | [ ENCRYPTED ] PASSWORD 'пароль' | PASSWORD NULL
    | VALID UNTIL 'дата_время'
    | IN ROLE имя_роли [, ...]
    | IN GROUP имя_роли [, ...]
    | ROLE имя_роли [, ...]
    | ADMIN имя_роли [, ...]
    | USER имя_роли [, ...]
    | SYSID uid

Описание

Команда CREATE USER теперь является просто синонимом CREATE ROLE. Единственное отличие в том, что для команды, записанной в виде CREATE USER, по умолчанию подразумевается LOGIN, а в виде CREATE ROLE подразумевается NOLOGIN.

Совместимость

Оператор CREATE USER является расширением PostgreSQL. В стандарте SQL определение пользователей считается зависимым от реализации.

См. также

CREATE ROLE


DROP GROUP

DROP GROUP — удалить роль в базе данных

Синтаксис

DROP GROUP [ IF EXISTS ] имя [, ...]

Описание

DROP GROUP теперь является синонимом оператора DROP ROLE.

Совместимость

Оператор DROP GROUP отсутствует в стандарте SQL.

См. также

DROP ROLE


DROP PUBLICATION

DROP PUBLICATION — удалить публикацию

Синтаксис

DROP PUBLICATION [ IF EXISTS ] имя [, ...] [ CASCADE | RESTRICT ]

Описание

DROP PUBLICATION удаляет существующую публикацию из базы данных.

Удалить публикацию может только её владелец или суперпользователь.

Параметры

IF EXISTS

Не считать ошибкой, если публикация не существует. В этом случае будет выдано замечание.

имя

Имя существующей публикации.

CASCADE

RESTRICT

Эти ключевые слова игнорируются, так как от публикаций не зависят никакие объекты.

Примеры

Удаление публикации:

DROP PUBLICATION mypublication;

Совместимость

DROP PUBLICATION является расширением PostgreSQL.

См. также

CREATE PUBLICATION, ALTER PUBLICATION


DROP USER

DROP USER — удалить роль в базе данных

Синтаксис

DROP USER [ IF EXISTS ] имя [, ...]

Описание

DROP USER — просто альтернативное написание команды DROP ROLE.

Совместимость

DROP USER является расширением PostgreSQL. В стандарте SQL определение пользователей считается зависимым от реализации.

См. также

DROP ROLE


postmaster

postmaster — сервер баз данных PostgreSQL

Синтаксис

postmaster [параметр...]

Описание

postmaster это устаревшее название postgres.

См. также

postgres


Часть VII. Внутреннее устройство

Содержит разнообразную информацию, полезную для разработчиков PostgreSQL.

Содержание

50. Обзор внутреннего устройства PostgreSQL
50.1. Путь запроса
50.2. Как устанавливаются соединения
50.3. Этап разбора
50.3.1. Разбор
50.3.2. Преобразование
50.4. Система правил PostgreSQL
50.5. Планировщик/оптимизатор
50.5.1. Выработка возможных планов
50.6. Исполнитель
51. Системные каталоги
51.1. Обзор
51.2. pg_aggregate
51.3. pg_am
51.4. pg_amop
51.5. pg_amproc
51.6. pg_attrdef
51.7. pg_attribute
51.8. pg_authid
51.9. pg_auth_members
51.10. pg_cast
51.11. pg_class
51.12. pg_collation
51.13. pg_constraint
51.14. pg_conversion
51.15. pg_database
51.16. pg_db_role_setting
51.17. pg_default_acl
51.18. pg_depend
51.19. pg_description
51.20. pg_enum
51.21. pg_event_trigger
51.22. pg_extension
51.23. pg_foreign_data_wrapper
51.24. pg_foreign_server
51.25. pg_foreign_table
51.26. pg_index
51.27. pg_inherits
51.28. pg_init_privs
51.29. pg_language
51.30. pg_largeobject
51.31. pg_largeobject_metadata
51.32. pg_namespace
51.33. pg_opclass
51.34. pg_operator
51.35. pg_opfamily
51.36. pg_partitioned_table
51.37. pg_pltemplate
51.38. pg_policy
51.39. pg_proc
51.40. pg_publication
51.41. pg_publication_rel
51.42. pg_range
51.43. pg_replication_origin
51.44. pg_rewrite
51.45. pg_seclabel
51.46. pg_sequence
51.47. pg_shdepend
51.48. pg_shdescription
51.49. pg_shseclabel
51.50. pg_statistic
51.51. pg_statistic_ext
51.52. pg_statistic_ext_data
51.53. pg_subscription
51.54. pg_subscription_rel
51.55. pg_tablespace
51.56. pg_transform
51.57. pg_trigger
51.58. pg_ts_config
51.59. pg_ts_config_map
51.60. pg_ts_dict
51.61. pg_ts_parser
51.62. pg_ts_template
51.63. pg_type
51.64. pg_user_mapping
51.65. Системные представления
51.66. pg_available_extensions
51.67. pg_available_extension_versions
51.68. pg_config
51.69. pg_cursors
51.70. pg_file_settings
51.71. pg_group
51.72. pg_hba_file_rules
51.73. pg_indexes
51.74. pg_locks
51.75. pg_matviews
51.76. pg_policies
51.77. pg_prepared_statements
51.78. pg_prepared_xacts
51.79. pg_publication_tables
51.80. pg_replication_origin_status
51.81. pg_replication_slots
51.82. pg_roles
51.83. pg_rules
51.84. pg_seclabels
51.85. pg_sequences
51.86. pg_settings
51.87. pg_shadow
51.88. pg_stats
51.89. pg_stats_ext
51.90. pg_tables
51.91. pg_timezone_abbrevs
51.92. pg_timezone_names
51.93. pg_user
51.94. pg_user_mappings
51.95. pg_views
52. Клиент-серверный протокол
52.1. Обзор
52.1.1. Обзор обмена сообщениями
52.1.2. Обзор расширенного выполнения запросов
52.1.3. Форматы и коды форматов
52.2. Поток сообщений
52.2.1. Запуск
52.2.2. Простое выполнение запросов
52.2.3. Расширенное выполнение запросов
52.2.4. Конвейеризация
52.2.5. Вызов функций
52.2.6. Операции COPY
52.2.7. Асинхронные операции
52.2.8. Отмена выполняющихся запросов
52.2.9. Завершение
52.2.10. Защита сеанса с SSL
52.2.11. Защита сеанса с GSSAPI
52.3. Аутентификация SASL
52.3.1. Аутентификация SCRAM-SHA-256
52.4. Протокол потоковой репликации
52.5. Протокол логической потоковой репликации
52.5.1. Параметры протокола логической потоковой репликации
52.5.2. Сообщения протокола логической репликации
52.5.3. Поток сообщений протокола логической репликации
52.6. Типы данных в сообщениях
52.7. Форматы сообщений
52.8. Поля сообщений с ошибками и замечаниями
52.9. Форматы сообщений логической репликации
52.10. Сводка изменений по сравнению с протоколом версии 2.0
53. Соглашения по оформлению кода PostgreSQL
53.1. Форматирование
53.2. Вывод сообщений об ошибках в коде сервера
53.3. Руководство по стилю сообщений об ошибках
53.4. Различные соглашения по оформлению кода
54. Языковая поддержка
54.1. Переводчику
54.1.1. Требования
54.1.2. Основные понятия
54.1.3. Создание и управление каталогами сообщений
54.1.4. Редактирование файлов PO
54.2. Программисту
54.2.1. Механизмы
54.2.2. Рекомендации по написанию сообщений
55. Написание обработчика процедурного языка
56. Написание обёртки сторонних данных
56.1. Функции обёрток сторонних данных
56.2. Подпрограммы обёртки сторонних данных
56.2.1. Подпрограммы FDW для сканирования сторонних таблиц
56.2.2. Подпрограммы FDW для сканирования сторонних соединений
56.2.3. Подпрограммы FDW для планирования обработки после сканирования/соединения
56.2.4. Подпрограммы FDW для изменения данных в сторонних таблицах
56.2.5. Подпрограммы FDW для блокировки строк
56.2.6. Подпрограммы FDW для EXPLAIN
56.2.7. Подпрограммы FDW для ANALYZE
56.2.8. Подпрограммы FDW для IMPORT FOREIGN SCHEMA
56.2.9. Подпрограммы FDW для параллельного выполнения
56.2.10. Подпрограммы FDW для изменения параметризации путей
56.3. Вспомогательные функции для обёрток сторонних данных
56.4. Планирование запросов с обёртками сторонних данных
56.5. Блокировка строк в обёртках сторонних данных
57. Написание метода извлечения выборки таблицы
57.1. Опорные функции метода извлечения выборки
58. Написание провайдера нестандартного сканирования
58.1. Создание нестандартных путей сканирования
58.1.1. Обработчики пути нестандартного сканирования
58.2. Создание нестандартных планов сканирования
58.2.1. Обработчики плана нестандартного сканирования
58.3. Выполнение нестандартного сканирования
58.3.1. Обработчики выполнения нестандартного сканирования
59. Генетический оптимизатор запросов
59.1. Обработка запроса как сложная задача оптимизации
59.2. Генетические алгоритмы
59.3. Генетическая оптимизация запросов (GEQO) в PostgreSQL
59.3.1. Построение возможных планов с GEQO
59.3.2. Будущее развитие модуля PostgreSQL GEQO
59.4. Дополнительные источники информации
60. Определение интерфейса для табличных методов доступа
61. Определение интерфейса для индексных методов доступа
61.1. Базовая структура API для индексов
61.2. Функции для индексных методов доступа
61.3. Сканирование индекса
61.4. Замечания о блокировке с индексами
61.5. Проверки уникальности в индексе
61.6. Функции оценки стоимости индекса
62. Унифицированные записи WAL
63. Индексы B-деревья
63.1. Введение
63.2. Поведение классов операторов B-дерева
63.3. Опорные функции B-деревьев
63.4. Реализация
64. Индексы GiST
64.1. Введение
64.2. Встроенные классы операторов
64.3. Расширяемость
64.4. Реализация
64.4.1. Построение GiST с буферизацией
64.5. Примеры
65. Индексы SP-GiST
65.1. Введение
65.2. Встроенные классы операторов
65.3. Расширяемость
65.4. Реализация
65.4.1. Ограничения SP-GiST
65.4.2. SP-GiST без меток узлов
65.4.3. Внутренние кортежи «все-равны»
65.5. Примеры
66. Индексы GIN
66.1. Введение
66.2. Встроенные классы операторов
66.3. Расширяемость
66.4. Реализация
66.4.1. Методика быстрого обновления GIN
66.4.2. Алгоритм частичного соответствия
66.5. Приёмы и советы по применению GIN
66.6. Ограничения
66.7. Примеры
67. Индексы BRIN
67.1. Введение
67.1.1. Обслуживание индекса
67.2. Встроенные классы операторов
67.3. Расширяемость
68. Хеш-индексы
68.1. Обзор
68.2. Реализация
69. Физическое хранение базы данных
69.1. Размещение файлов базы данных
69.2. TOAST
69.2.1. Отдельное размещение TOAST на диске
69.2.2. Отдельное размещение TOAST в памяти
69.3. Карта свободного пространства
69.4. Карта видимости
69.5. Слой инициализации
69.6. Компоновка страницы базы данных
69.6.1. Компоновка строки таблицы
69.7. Кортежи только в куче (Heap-Only Tuples, HOT)
70. Объявление и начальное содержимое системных каталогов
70.1. Правила объявления системных каталогов
70.2. Исходные данные системных каталогов
70.2.1. Формат файла данных
70.2.2. Назначение OID
70.2.3. Поиск OID по ссылке
70.2.4. Автоматическое создание типов массивов
70.2.5. Рецепты по редактированию файлов данных
70.3. Формат файла BKI
70.4. Команды BKI
70.5. Структура файла BKI
70.6. Пример BKI
71. Как планировщик использует статистику
71.1. Примеры оценки количества строк
71.2. Примеры многовариантной статистики
71.2.1. Функциональные зависимости
71.2.2. Многовариантное число различных значений
71.2.3. Списки MCV
71.3. Статистика планировщика и безопасность


Глава 51. Системные каталоги

Содержание

51.1. Обзор
51.2. pg_aggregate
51.3. pg_am
51.4. pg_amop
51.5. pg_amproc
51.6. pg_attrdef
51.7. pg_attribute
51.8. pg_authid
51.9. pg_auth_members
51.10. pg_cast
51.11. pg_class
51.12. pg_collation
51.13. pg_constraint
51.14. pg_conversion
51.15. pg_database
51.16. pg_db_role_setting
51.17. pg_default_acl
51.18. pg_depend
51.19. pg_description
51.20. pg_enum
51.21. pg_event_trigger
51.22. pg_extension
51.23. pg_foreign_data_wrapper
51.24. pg_foreign_server
51.25. pg_foreign_table
51.26. pg_index
51.27. pg_inherits
51.28. pg_init_privs
51.29. pg_language
51.30. pg_largeobject
51.31. pg_largeobject_metadata
51.32. pg_namespace
51.33. pg_opclass
51.34. pg_operator
51.35. pg_opfamily
51.36. pg_partitioned_table
51.37. pg_pltemplate
51.38. pg_policy
51.39. pg_proc
51.40. pg_publication
51.41. pg_publication_rel
51.42. pg_range
51.43. pg_replication_origin
51.44. pg_rewrite
51.45. pg_seclabel
51.46. pg_sequence
51.47. pg_shdepend
51.48. pg_shdescription
51.49. pg_shseclabel
51.50. pg_statistic
51.51. pg_statistic_ext
51.52. pg_statistic_ext_data
51.53. pg_subscription
51.54. pg_subscription_rel
51.55. pg_tablespace
51.56. pg_transform
51.57. pg_trigger
51.58. pg_ts_config
51.59. pg_ts_config_map
51.60. pg_ts_dict
51.61. pg_ts_parser
51.62. pg_ts_template
51.63. pg_type
51.64. pg_user_mapping
51.65. Системные представления
51.66. pg_available_extensions
51.67. pg_available_extension_versions
51.68. pg_config
51.69. pg_cursors
51.70. pg_file_settings
51.71. pg_group
51.72. pg_hba_file_rules
51.73. pg_indexes
51.74. pg_locks
51.75. pg_matviews
51.76. pg_policies
51.77. pg_prepared_statements
51.78. pg_prepared_xacts
51.79. pg_publication_tables
51.80. pg_replication_origin_status
51.81. pg_replication_slots
51.82. pg_roles
51.83. pg_rules
51.84. pg_seclabels
51.85. pg_sequences
51.86. pg_settings
51.87. pg_shadow
51.88. pg_stats
51.89. pg_stats_ext
51.90. pg_tables
51.91. pg_timezone_abbrevs
51.92. pg_timezone_names
51.93. pg_user
51.94. pg_user_mappings
51.95. pg_views

Системные каталоги — это место, где система управления реляционной базой данных хранит метаданные схемы, в частности информацию о таблицах и столбцах, а также служебные сведения. Системные каталоги PostgreSQL представляют собой обычные таблицы. Поэтому вы можете удалить и пересоздать их, добавить столбцы, изменить и добавить строки, т. е. разными способами вмешаться в работу системы. Обычно модифицировать системные каталоги вручную не следует, для всего этого, как правило, есть команды SQL. (Например, CREATE DATABASE вставляет строку в каталог pg_database — и фактически создаёт базу данных на диске.) Исключение составляют только особенные эзотерические операции, но многие из них со временем становятся выполнимыми посредством SQL-команд, так что потребность напрямую модифицировать системные каталоги постоянно уменьшается.

51.1. Обзор

В Таблице 51.1 перечислены системные каталоги. Подробное описание каждого каталога следует далее.

Большинство системных каталогов копируются из базы-шаблона при создании базы данных и затем принадлежат этой базе. Но некоторые каталоги физически разделяются всеми базами данных в кластере; это отмечено в их описаниях.

Таблица 51.1. Системные каталоги

Имя каталога | Предназначение
pg_aggregate | агрегатные функции
pg_am | методы доступа отношений
pg_amop | операторы методов доступа
pg_amproc | опорные функции методов доступа
pg_attrdef | значения столбцов по умолчанию
pg_attribute | столбцы таблиц («атрибуты»)
pg_authid | идентификаторы для авторизации (роли)
pg_auth_members | отношения членства для объектов авторизации
pg_cast | приведения (преобразования типов данных)
pg_class | таблицы, индексы, последовательности, представления («отношения»)
pg_collation | правила сортировки (параметры локали)
pg_constraint | ограничения-проверки, ограничения уникальности, ограничения первичного ключа и внешних ключей
pg_conversion | информация о перекодировках
pg_database | базы данных в этом кластере
pg_db_role_setting | параметры, задаваемые на уровне ролей и баз данных
pg_default_acl | права по умолчанию для различных типов объектов
pg_depend | зависимости между объектами базы данных
pg_description | описания или комментарии к объектам базы данных
pg_enum | определения меток и значений перечислений
pg_event_trigger | событийные триггеры
pg_extension | установленные расширения
pg_foreign_data_wrapper | определения обёрток сторонних данных
pg_foreign_server | определения сторонних серверов
pg_foreign_table | дополнительные свойства сторонних таблиц
pg_index | дополнительные свойства индексов
pg_inherits | иерархия наследования таблиц
pg_init_privs | начальные права для объектов
pg_language | языки для написания функций
pg_largeobject | страницы данных для больших объектов
pg_largeobject_metadata | метаданные для больших объектов
pg_namespace | схемы
pg_opclass | классы операторов методов доступа
pg_operator | операторы
pg_opfamily | семейства операторов методов доступа
pg_partitioned_table | информация о ключах секционирования таблиц
pg_pltemplate | данные шаблонов для процедурных языков
pg_policy | политики защиты строк
pg_proc | функции и процедуры
pg_publication | публикации для логической репликации
pg_publication_rel | сопоставление отношений с публикациями
pg_range | информация о типах диапазонов
pg_replication_origin | зарегистрированные источники репликации
pg_rewrite | правила перезаписи запросов
pg_seclabel | метки безопасности для объектов базы данных
pg_sequence | информация о последовательностях
pg_shdepend | зависимости общих объектов
pg_shdescription | комментарии к общим объектам
pg_shseclabel | метки безопасности для общих объектов баз данных
pg_statistic | статистика планировщика
pg_statistic_ext | расширенная статистика планировщика (определение)
pg_statistic_ext_data | расширенная статистика планировщика (собранная статистика)
pg_subscription | подписки логической репликации
pg_subscription_rel | состояние отношений для подписок
pg_tablespace | табличные пространства в этом кластере баз данных
pg_transform | трансформации (тип данных для преобразований процедурных языков)
pg_trigger | триггеры
pg_ts_config | конфигурации текстового поиска
pg_ts_config_map | сопоставления фрагментов в конфигурациях текстового поиска
pg_ts_dict | словари текстового поиска
pg_ts_parser | анализаторы текстового поиска
pg_ts_template | шаблоны текстового поиска
pg_type | типы данных
pg_user_mapping | сопоставления пользователей для сторонних серверов


51.14. pg_conversion

В каталоге pg_conversion описываются функции преобразования кодировки. За дополнительными сведениями обратитесь к CREATE CONVERSION.

Таблица 51.14. Столбцы pg_conversion

Name | Тип | Ссылки | Описание
oid | oid |  | Идентификатор строки
conname | name |  | Имя перекодировки (уникальное в пространстве имён)
connamespace | oid | pg_namespace.oid | OID пространства имён, содержащего эту перекодировку
conowner | oid | pg_authid.oid | Владелец перекодировки
conforencoding | int4 |  | Идентификатор исходной кодировки
contoencoding | int4 |  | Идентификатор целевой кодировки
conproc | regproc | pg_proc.oid | Функция преобразования
condefault | bool |  | True, если это перекодировка по умолчанию


51.31. pg_largeobject_metadata

В каталоге pg_largeobject_metadata содержатся метаданные, связанные с большими объектами. Собственно данные больших объектов хранятся в pg_largeobject.

Таблица 51.31. Столбцы pg_largeobject_metadata

Name | Тип | Ссылки | Описание
oid | oid |  | Идентификатор строки
lomowner | oid | pg_authid.oid | Владелец большого объекта
lomacl | aclitem[] |  | Права доступа; за подробностями обратитесь к Разделу 5.7.


51.34. pg_operator

В каталоге pg_operator хранится информация об операторах. За дополнительными сведениями обратитесь к описанию CREATE OPERATOR и Разделу 37.14.

Таблица 51.34. Столбцы pg_operator

Name | Тип | Ссылки | Описание
oid | oid |  | Идентификатор строки
oprname | name |  | Имя оператора
oprnamespace | oid | pg_namespace.oid | OID пространства имён, содержащего этот оператор
oprowner | oid | pg_authid.oid | Владелец оператора
oprkind | char |  | b = инфиксный («both»), l = префиксный («left»), r = постфиксный («right»)
oprcanmerge | bool |  | Этот оператор поддерживает соединение слиянием
oprcanhash | bool |  | Этот оператор поддерживает соединение по хешу
oprleft | oid | pg_type.oid | Тип левого операнда
oprright | oid | pg_type.oid | Тип правого операнда
oprresult | oid | pg_type.oid | Тип результата
oprcom | oid | pg_operator.oid | Коммутирующий для данного оператор, если есть
oprnegate | oid | pg_operator.oid | Обратный для данного оператор, если есть
oprcode | regproc | pg_proc.oid | Функция, реализующая этот оператор
oprrest | regproc | pg_proc.oid | Функция оценки избирательности ограничения для данного оператора
oprjoin | regproc | pg_proc.oid | Функция оценки избирательности соединения для данного оператора

Неиспользуемые поля содержат нули. Например, поле oprleft будет содержать ноль для префиксного оператора.


51.41. pg_publication_rel

Каталог pg_publication_rel содержит сопоставления отношений и публикаций в базе данных (это сопоставления вида многие-ко-многим). Более понятное пользователю представление этой информации можно также получить в Разделе 51.79.

Таблица 51.41. Столбцы pg_publication_rel

Name | Тип | Ссылки | Описание
prpubid | oid | pg_publication.oid | Ссылка на публикацию
prrelid | oid | pg_class.oid | Ссылка на отношение


51.71. pg_group

Представление pg_group существует для обратной совместимости: оно эмулирует каталог, существовавший в PostgreSQL до версии 8.1. В нём показываются имена и члены всех ролей без признака rolcanlogin, что приблизительно соответствует списку ролей, которые использовались как группы.

Таблица 51.72. Столбцы pg_group

Name | Тип | Ссылки | Описание
groname | name | pg_authid.rolname | Имя группы
grosysid | oid | pg_authid.oid | ID этой группы
grolist | oid[] | pg_authid.oid | Массив, содержащий идентификаторы ролей в этой группе


51.73. pg_indexes

Представление pg_indexes даёт доступ к полезной информации обо всех индексах в базе данных.

Таблица 51.74. Столбцы pg_indexes

Name | Тип | Ссылки | Описание
schemaname | name | pg_namespace.nspname | Имя схемы, содержащей таблицу и индекс
tablename | name | pg_class.relname | Имя таблицы, для которой создан индекс
indexname | name | pg_class.relname | Имя индекса
tablespace | name | pg_tablespace.spcname | Имя табличного пространства, содержащего индекс (NULL, если это пространство по умолчанию)
indexdef | text |  | Определение индекса (реконструированная команда CREATE INDEX)


51.79. pg_publication_tables

Представление pg_publication_tables содержит информацию о сопоставлениях публикаций с таблицами, которые в них содержатся. В отличие от нижележащего каталога pg_publication_rel, в это представление добавляются публикации, определённые как FOR ALL TABLES, так что с такими публикациями будет присутствовать строка для каждой соответствующей таблицы.

Таблица 51.80. Столбцы pg_publication_tables

Name | Тип | Ссылки | Описание
pubname | name | pg_publication.pubname | Имя публикации
schemaname | name | pg_namespace.nspname | Имя схемы, содержащей таблицу
tablename | name | pg_class.relname | Имя таблицы


51.83. pg_rules

Представление pg_rules открывает доступ к полезной информации о правилах перезаписи запросов.

Таблица 51.84. Столбцы pg_rules

Name | Тип | Ссылки | Описание
schemaname | name | pg_namespace.nspname | Имя схемы, содержащей таблицу
tablename | name | pg_class.relname | Имя таблицы, с которой связано это правило
rulename | name | pg_rewrite.rulename | Имя правила
definition | text |  | Определение правила (реконструированная команда создания)

Из представления pg_rules исключены правила ON SELECT для представлений и материализованных представлений; их можно увидеть в pg_views и pg_matviews.


51.90. pg_tables

Представление pg_tables даёт доступ к полезной информации обо всех таблицах в базе данных.

Таблица 51.91. Столбцы pg_tables

Name | Тип | Ссылки | Описание
schemaname | name | pg_namespace.nspname | Имя схемы, содержащей таблицу
tablename | name | pg_class.relname | Имя таблицы
tableowner | name | pg_authid.rolname | Имя владельца таблицы
tablespace | name | pg_tablespace.spcname | Имя табличного пространства, содержащего таблицу (NULL, если это пространство по умолчанию)
hasindexes | boolean | pg_class.relhasindex | True, если эта таблица имеет (или недавно имела) индексы
hasrules | boolean | pg_class.relhasrules | True, если для таблицы определены (или были определены) правила
hastriggers | boolean | pg_class.relhastriggers | True, если для таблицы определены (или были определены) триггеры
rowsecurity | boolean | pg_class.relrowsecurity | True, если для таблицы включена защита строк


51.95. pg_views

Представление pg_views даёт доступ к полезной информации обо всех представлениях в базе данных.

Таблица 51.96. Столбцы pg_views

Name | Тип | Ссылки | Описание
schemaname | name | pg_namespace.nspname | Имя схемы, содержащей представление
viewname | name | pg_class.relname | Имя представления
viewowner | name | pg_authid.rolname | Имя владельца представления
definition | text |  | Определение представления (реконструированный запрос SELECT)


63.4. Реализация

Вводное описание реализации индекса btree можно найти в src/backend/access/nbtree/README.


64.2. Встроенные классы операторов

В базовый дистрибутив PostgreSQL включены классы операторов GiST, перечисленные в Таблице 64.1. (Некоторые дополнительные модули, описанные в Приложении F, добавляют другие классы операторов GiST.)

Таблица 64.1. Встроенные классы операторов GiST

Имя | Индексируемый тип данных | Индексируемые операторы | Операторы упорядочивания
box_ops | box | && &> &< &<| >> << <<| <@ @> @ |&> |>> ~ ~= |
circle_ops | circle | && &> &< &<| >> << <<| <@ @> @ |&> |>> ~ ~= | <->
inet_ops | inet, cidr | && >> >>= > >= <> << <<= < <= = |
point_ops | point | >> >^ << <@ <@ <@ <^ ~= | <->
poly_ops | polygon | && &> &< &<| >> << <<| <@ @> @ |&> |>> ~ ~= | <->
range_ops | любой тип диапазона | && &> &< >> << <@ -|- = @> @> |
tsquery_ops | tsquery | <@ @> |
tsvector_ops | tsvector | @@ |

По историческим причинам класс операторов inet_ops не является классом по умолчанию для типов inet и cidr. Чтобы использовать его, укажите имя класса в CREATE INDEX, например:

CREATE INDEX ON my_table USING GIST (my_inet_column inet_ops);


65.2. Встроенные классы операторов

В базовый дистрибутив PostgreSQL включены классы операторов SP-GiST, перечисленные в Таблице 65.1.

Таблица 65.1. Встроенные классы операторов SP-GiST

Имя | Индексируемый тип данных | Индексируемые операторы | Операторы упорядочивания
kd_point_ops | point | << <@ <^ >> >^ ~= | <->
quad_point_ops | point | << <@ <^ >> >^ ~= | <->
range_ops | любой тип диапазона | && &< &> -|- << <@ = >> @> |
box_ops | box | << &< && &> >> ~= @> <@ &<| <<| |>> |&> |
poly_ops | polygon | << &< && &> >> ~= @> <@ &<| <<| |>> |&> | <->
text_ops | text | < <= = > >= ~<=~ ~<~ ~>=~ ~>~ ^@ |
inet_ops | inet, cidr | && >> >>= > >= <> << <<= < <= = |

Из двух классов операторов для типа point классом по умолчанию является quad_point_ops. Класс kd_point_ops поддерживает те же операторы, но использует другую структуру данных индекса, которая может дать выигрыш в скорости для некоторых приложений.

Классы операторов quad_point_ops, kd_point_ops и poly_ops поддерживают оператор упорядочивания <->, позволяющий выполнить поиск k ближайших соседей (k-NN) по индексированному набору точек или многоугольников.


67.2. Встроенные классы операторов

В базовый дистрибутив PostgreSQL включены классы операторов BRIN, перечисленные в Таблице 67.1.

Классы операторов minmax хранят минимальные и максимальные значения, встречающиеся в индексированном столбце в определённой зоне. Классы операторов inclusion хранят значение, в котором содержатся значения индексированного столбца в определённой зоне.

Таблица 67.1. Встроенные классы операторов BRIN

Имя | Индексируемый тип данных | Индексируемые операторы
int8_minmax_ops | bigint | < <= = >= >
bit_minmax_ops | bit | < <= = >= >
varbit_minmax_ops | bit varying | < <= = >= >
box_inclusion_ops | box | << &< && &> >> ~= @> <@ &<| <<| |>> |&>
bytea_minmax_ops | bytea | < <= = >= >
bpchar_minmax_ops | character | < <= = >= >
char_minmax_ops | "char" | < <= = >= >
date_minmax_ops | date | < <= = >= >
float8_minmax_ops | double precision | < <= = >= >
inet_minmax_ops | inet | < <= = >= >
network_inclusion_ops | inet | && >>= <<= = >> <<
int4_minmax_ops | integer | < <= = >= >
interval_minmax_ops | interval | < <= = >= >
macaddr_minmax_ops | macaddr | < <= = >= >
macaddr8_minmax_ops | macaddr8 | < <= = >= >
name_minmax_ops | name | < <= = >= >
numeric_minmax_ops | numeric | < <= = >= >
pg_lsn_minmax_ops | pg_lsn | < <= = >= >
oid_minmax_ops | oid | < <= = >= >
range_inclusion_ops | любой тип диапазона | << &< && &> >> @> <@ -|- = < <= = > >=
float4_minmax_ops | real | < <= = >= >
int2_minmax_ops | smallint | < <= = >= >
text_minmax_ops | text | < <= = >= >
tid_minmax_ops | tid | < <= = >= >
timestamp_minmax_ops | timestamp without time zone | < <= = >= >
timestamptz_minmax_ops | timestamp with time zone | < <= = >= >
time_minmax_ops | время без часового пояса | < <= = >= >
timetz_minmax_ops | time with time zone | < <= = >= >
uuid_minmax_ops | uuid | < <= = >= >


Приложение A. Коды ошибок PostgreSQL

Всем сообщениям, которые выдаёт сервер PostgreSQL, назначены пятисимвольные коды ошибок, соответствующие кодам «SQLSTATE», описанным в стандарте SQL. Приложения, которые должны знать, какое условие ошибки имело место, обычно проверяют код ошибки и только потом обращаются к текстовому сообщению об ошибке. Коды ошибок, скорее всего, не изменятся от выпуска к выпуску PostgreSQL, и они не меняются при локализации как сообщения об ошибках. Заметьте, что отдельные, но не все коды ошибок, которые выдаёт PostgreSQL, определены стандартом SQL; некоторые дополнительные коды ошибок для условий, не описанных стандартом, были добавлены независимо или позаимствованы из других баз данных.

Согласно стандарту, первые два символа кода ошибки обозначают класс ошибок, а последние три символа обозначают определённое условие в этом классе. Таким образом, приложение, не знающее значение определённого кода ошибки, всё же может понять, что делать, по классу ошибки.

В Таблице A.1 перечислены все коды ошибок, определённые в PostgreSQL 12.21. (Некоторые коды в настоящее время не используются, хотя они определены в стандарте SQL.) Также показаны классы ошибок. Для каждого класса ошибок имеется «стандартный» код ошибки с последними тремя символами 000. Этот код выдаётся только для таких условий ошибок, которые относятся к некоторому классу, но не имеют более определённого кода.

Символ, указанный в столбце «Имя условия», определяет условие в PL/pgSQL. Имена условий могут записываться в верхнем или нижнем регистре. (Заметьте, что PL/pgSQL, в отличие от ошибок, не распознаёт предупреждения; то есть классы 00, 01 и 02.)

Для некоторых типов ошибок сервер сообщает имя объекта базы данных (таблица, столбец таблицы, тип данных или ограничение), связанного с ошибкой; например, имя уникального ограничения, вызвавшего ошибку unique_violation. Такие имена передаются в отдельных полях сообщения об ошибке, чтобы приложениям не пришлось извлекать его из возможно локализованного текста ошибки для человека. На момент выхода PostgreSQL 9.3 полностью охватывались только ошибки класса SQLSTATE 23 (нарушения ограничений целостности), но в будущем должны быть охвачены и другие классы.

Таблица A.1. Коды ошибок PostgreSQL

Код ошибки | Имя условия
Класс 00 — Успешное завершение
00000 | successful_completion
Класс 01 — Предупреждение
01000 | warning
0100C | dynamic_result_sets_returned
01008 | implicit_zero_bit_padding
01003 | null_value_eliminated_in_set_function
01007 | privilege_not_granted
01006 | privilege_not_revoked
01004 | string_data_right_truncation
01P01 | deprecated_feature
Класс 02 — Нет данных (это также класс предупреждений согласно стандарту SQL)
02000 | no_data
02001 | no_additional_dynamic_result_sets_returned
Класс 03 — SQL-оператор ещё не завершён
03000 | sql_statement_not_yet_complete
Класс 08 — Исключение, связанное с подключением
08000 | connection_exception
08003 | connection_does_not_exist
08006 | connection_failure
08001 | sqlclient_unable_to_establish_sqlconnection
08004 | sqlserver_rejected_establishment_of_sqlconnection
08007 | transaction_resolution_unknown
08P01 | protocol_violation
Класс 09 — Исключение с действием триггера
09000 | triggered_action_exception
Класс 0A — Неподдерживаемая функциональность
0A000 | feature_not_supported
Класс 0B — Неверное начало транзакции
0B000 | invalid_transaction_initiation
Класс 0F — Исключение с указателем на данные
0F000 | locator_exception
0F001 | invalid_locator_specification
Класс 0L — Неверный праводатель
0L000 | invalid_grantor
0LP01 | invalid_grant_operation
Класс 0P — Неверное указание роли
0P000 | invalid_role_specification
Класс 0Z — Исключение диагностики
0Z000 | diagnostics_exception
0Z002 | stacked_diagnostics_accessed_without_active_handler
Класс 20 — Case не найден
20000 | case_not_found
Класс 21 — Нарушение количества
21000 | cardinality_violation
Класс 22 — Исключение в данных
22000 | data_exception
2202E | array_subscript_error
22021 | character_not_in_repertoire
22008 | datetime_field_overflow
22012 | division_by_zero
22005 | error_in_assignment
2200B | escape_character_conflict
22022 | indicator_overflow
22015 | interval_field_overflow
2201E | invalid_argument_for_logarithm
22014 | invalid_argument_for_ntile_function
22016 | invalid_argument_for_nth_value_function
2201F | invalid_argument_for_power_function
2201G | invalid_argument_for_width_bucket_function
22018 | invalid_character_value_for_cast
22007 | invalid_datetime_format
22019 | invalid_escape_character
2200D | invalid_escape_octet
22025 | invalid_escape_sequence
22P06 | nonstandard_use_of_escape_character
22010 | invalid_indicator_parameter_value
22023 | invalid_parameter_value
22013 | invalid_preceding_or_following_size
2201B | invalid_regular_expression
2201W | invalid_row_count_in_limit_clause
2201X | invalid_row_count_in_result_offset_clause
2202H | invalid_tablesample_argument
2202G | invalid_tablesample_repeat
22009 | invalid_time_zone_displacement_value
2200C | invalid_use_of_escape_character
2200G | most_specific_type_mismatch
22004 | null_value_not_allowed
22002 | null_value_no_indicator_parameter
22003 | numeric_value_out_of_range
2200H | sequence_generator_limit_exceeded
22026 | string_data_length_mismatch
22001 | string_data_right_truncation
22011 | substring_error
22027 | trim_error
22024 | unterminated_c_string
2200F | zero_length_character_string
22P01 | floating_point_exception
22P02 | invalid_text_representation
22P03 | invalid_binary_representation
22P04 | bad_copy_file_format
22P05 | untranslatable_character
2200L | not_an_xml_document
2200M | invalid_xml_document
2200N | invalid_xml_content
2200S | invalid_xml_comment
2200T | invalid_xml_processing_instruction
22030 | duplicate_json_object_key_value
22032 | invalid_json_text
22033 | invalid_sql_json_subscript
22034 | more_than_one_sql_json_item
22035 | no_sql_json_item
22036 | non_numeric_sql_json_item
22037 | non_unique_keys_in_a_json_object
22038 | singleton_sql_json_item_required
22039 | sql_json_array_not_found
2203A | sql_json_member_not_found
2203B | sql_json_number_not_found
2203C | sql_json_object_not_found
2203D | too_many_json_array_elements
2203E | too_many_json_object_members
2203F | sql_json_scalar_required
Класс 23 — Нарушение ограничения целостности
23000 | integrity_constraint_violation
23001 | restrict_violation
23502 | not_null_violation
23503 | foreign_key_violation
23505 | unique_violation
23514 | check_violation
23P01 | exclusion_violation
Класс 24 — Неверное состояние курсора
24000 | invalid_cursor_state
Класс 25 — Неверное состояние транзакции
25000 | invalid_transaction_state
25001 | active_sql_transaction
25002 | branch_transaction_already_active
25008 | held_cursor_requires_same_isolation_level
25003 | inappropriate_access_mode_for_branch_transaction
25004 | inappropriate_isolation_level_for_branch_transaction
25005 | no_active_sql_transaction_for_branch_transaction
25006 | read_only_sql_transaction
25007 | schema_and_data_statement_mixing_not_supported
25P01 | no_active_sql_transaction
25P02 | in_failed_sql_transaction
25P03 | idle_in_transaction_session_timeout
Класс 26 — Неверное имя SQL-оператора
26000 | invalid_sql_statement_name
Класс 27 — Нарушение при изменении данных в триггере
27000 | triggered_data_change_violation
Класс 28 — Неверное указание авторизации
28000 | invalid_authorization_specification
28P01 | invalid_password
Класс 2B — Зависимые описания привилегий всё ещё существуют
2B000 | dependent_privilege_descriptors_still_exist
2BP01 | dependent_objects_still_exist
Класс 2D — Неверное завершение транзакции
2D000 | invalid_transaction_termination
Класс 2F — Исключение в подпрограмме SQL
2F000 | sql_routine_exception
2F005 | function_executed_no_return_statement
2F002 | modifying_sql_data_not_permitted
2F003 | prohibited_sql_statement_attempted
2F004 | reading_sql_data_not_permitted
Класс 34 — Неверное имя курсора
34000 | invalid_cursor_name
Класс 38 — Исключение во внешней подпрограмме
38000 | external_routine_exception
38001 | containing_sql_not_permitted
38002 | modifying_sql_data_not_permitted
38003 | prohibited_sql_statement_attempted
38004 | reading_sql_data_not_permitted
Класс 39 — Исключение при вызове внешней подпрограммы
39000 | external_routine_invocation_exception
39001 | invalid_sqlstate_returned
39004 | null_value_not_allowed
39P01 | trigger_protocol_violated
39P02 | srf_protocol_violated
39P03 | event_trigger_protocol_violated
Класс 3B — Исключение точки сохранения
3B000 | savepoint_exception
3B001 | invalid_savepoint_specification
Класс 3D — Неверное имя каталога
3D000 | invalid_catalog_name
Класс 3F — Неверное имя схемы
3F000 | invalid_schema_name
Класс 40 — Откат транзакции
40000 | transaction_rollback
40002 | transaction_integrity_constraint_violation
40001 | serialization_failure
40003 | statement_completion_unknown
40P01 | deadlock_detected
Класс 42 — Ошибка синтаксиса или нарушение правила доступа
42000 | syntax_error_or_access_rule_violation
42601 | syntax_error
42501 | insufficient_privilege
42846 | cannot_coerce
42803 | grouping_error
42P20 | windowing_error
42P19 | invalid_recursion
42830 | invalid_foreign_key
42602 | invalid_name
42622 | name_too_long
42939 | reserved_name
42804 | datatype_mismatch
42P18 | indeterminate_datatype
42P21 | collation_mismatch
42P22 | indeterminate_collation
42809 | wrong_object_type
428C9 | generated_always
42703 | undefined_column
42883 | undefined_function
42P01 | undefined_table
42P02 | undefined_parameter
42704 | undefined_object
42701 | duplicate_column
42P03 | duplicate_cursor
42P04 | duplicate_database
42723 | duplicate_function
42P05 | duplicate_prepared_statement
42P06 | duplicate_schema
42P07 | duplicate_table
42712 | duplicate_alias
42710 | duplicate_object
42702 | ambiguous_column
42725 | ambiguous_function
42P08 | ambiguous_parameter
42P09 | ambiguous_alias
42P10 | invalid_column_reference
42611 | invalid_column_definition
42P11 | invalid_cursor_definition
42P12 | invalid_database_definition
42P13 | invalid_function_definition
42P14 | invalid_prepared_statement_definition
42P15 | invalid_schema_definition
42P16 | invalid_table_definition
42P17 | invalid_object_definition
Класс 44 — Нарушение WITH CHECK OPTION
44000 | with_check_option_violation
Класс 53 — Нехватка ресурсов
53000 | insufficient_resources
53100 | disk_full
53200 | out_of_memory
53300 | too_many_connections
53400 | configuration_limit_exceeded
Класс 54 — Превышение ограничения программы
54000 | program_limit_exceeded
54001 | statement_too_complex
54011 | too_many_columns
54023 | too_many_arguments
Класс 55 — Объект не в требуемом состоянии
55000 | object_not_in_prerequisite_state
55006 | object_in_use
55P02 | cant_change_runtime_param
55P03 | lock_not_available
55P04 | unsafe_new_enum_value_usage
Класс 57 — Вмешательство оператора
57000 | operator_intervention
57014 | query_canceled
57P01 | admin_shutdown
57P02 | crash_shutdown
57P03 | cannot_connect_now
57P04 | database_dropped
Класс 58 — Ошибка системы (ошибка, внешняя по отношению к PostgreSQL)
58000 | system_error
58030 | io_error
58P01 | undefined_file
58P02 | duplicate_file
Класс 72 — Ошибка снимка
72000 | snapshot_too_old
Класс F0 — Ошибка файла конфигурации
F0000 | config_file_error
F0001 | lock_file_exists
Класс HV — Ошибка обёртки сторонних данных (SQL/MED)
HV000 | fdw_error
HV005 | fdw_column_name_not_found
HV002 | fdw_dynamic_parameter_value_needed
HV010 | fdw_function_sequence_error
HV021 | fdw_inconsistent_descriptor_information
HV024 | fdw_invalid_attribute_value
HV007 | fdw_invalid_column_name
HV008 | fdw_invalid_column_number
HV004 | fdw_invalid_data_type
HV006 | fdw_invalid_data_type_descriptors
HV091 | fdw_invalid_descriptor_field_identifier
HV00B | fdw_invalid_handle
HV00C | fdw_invalid_option_index
HV00D | fdw_invalid_option_name
HV090 | fdw_invalid_string_length_or_buffer_length
HV00A | fdw_invalid_string_format
HV009 | fdw_invalid_use_of_null_pointer
HV014 | fdw_too_many_handles
HV001 | fdw_out_of_memory
HV00P | fdw_no_schemas
HV00J | fdw_option_name_not_found
HV00K | fdw_reply_handle
HV00Q | fdw_schema_not_found
HV00R | fdw_table_not_found
HV00L | fdw_unable_to_create_execution
HV00M | fdw_unable_to_create_reply
HV00N | fdw_unable_to_establish_connection
Класс P0 — Ошибка PL/pgSQL
P0000 | plpgsql_error
P0001 | raise_exception
P0002 | no_data_found
P0003 | too_many_rows
P0004 | assert_failure
Класс XX — Внутренняя ошибка
XX000 | internal_error
XX001 | data_corrupted
XX002 | index_corrupted


Приложение C. Ключевые слова SQL

В Таблице C.1 перечислены все слова, которые являются ключевыми в стандарте SQL и в PostgreSQL 12.21. Общее описание ключевых слов можно найти в Подразделе 4.1.1. (Для экономии места в таблицу включены только две последние версии стандарта SQL и SQL-92 для исторического сравнения. Отличия между ними и другими промежуточными версиями стандарта невелики.)

В SQL есть различие между зарезервированными и незарезервированными ключевыми словами. Согласно стандарту, действительно ключевыми словами являются только зарезервированные слова; они не могут быть идентификаторами. Незарезервированные ключевые слова имеют особое значение только в определённых контекстах и могут быть идентификаторами в других. Большинство незарезервированных ключевых слов на самом деле представляют имена встроенных таблиц и функций, определённых в SQL. Концепция незарезервированных ключевых слов собственно введена только для того, чтобы показать, что эти слова имеют некоторое предопределённое значение в отдельных контекстах.

В PostgreSQL анализатор SQL сталкивается с дополнительными сложностями. Ему приходится иметь дело с несколькими различными классами элементов языка, начиная с тех, что никогда не могут использоваться как идентификаторы, и заканчивая теми, что не имеют никаких особых отличий от обычных идентификаторов. (Последнее обычно относится к функциям, описанным в SQL.) Даже зарезервированные ключевые слова не полностью зарезервированы в PostgreSQL, а могут использоваться в качестве меток столбцов (например, можно написать SELECT 55 AS CHECK, хотя CHECK и является зарезервированным ключевым словом).

В Таблице C.1, в столбце PostgreSQL мы даём пометку «не зарезервировано» тем ключевым словам, которые явно известны анализатору запросов, но их можно использовать в качестве имени столбца или таблицы. Некоторые ключевые слова, которые недопустимы в качестве имени функции или типа данных, но в остальном не отличаются от незарезервированных слов, помечены соответственно. (Большинство из этих слов представляют встроенные функции или типы данных со специальным синтаксисом. Функции или типы с таким именем существуют, но пользователь не может их переопределить.) Метка «зарезервировано» даётся тем словам, которые не могут быть именами столбцов или таблиц. Некоторые зарезервированные ключевые слова могут быть именами функций или типов данных; это также отмечается в таблице. Если такой пометки нет, зарезервированное слово допускается только в качестве метки столбца «AS».

Вообще, если вы сталкиваетесь с разнообразными ошибками разбора команд, содержащих в качестве идентификаторов какие-либо из перечисленных ключевых слов, попробуйте для решения проблемы заключить идентификатор в кавычки.

Изучая Таблицу C.1, важно понимать, что отсутствие какого-либо ключевого слова в списке зарезервированных в PostgreSQL не означает, что функциональность, связанная с этим словом, не реализована. И наоборот, присутствие ключевого слова не обязательно говорит о наличии соответствующей функциональности.

Таблица C.1. SQL Key Words

Key Word | PostgreSQL | SQL:2016 | SQL:2011 | SQL-92
A |  | non-reserved | non-reserved |
ABORT | non-reserved |  |  |
ABS |  | reserved | reserved |
ABSENT |  | non-reserved | non-reserved |
ABSOLUTE | non-reserved | non-reserved | non-reserved | reserved
ACCESS | non-reserved |  |  |
ACCORDING |  | non-reserved | non-reserved |
ACOS |  | reserved |  |
ACTION | non-reserved | non-reserved | non-reserved | reserved
ADA |  | non-reserved | non-reserved | non-reserved
ADD | non-reserved | non-reserved | non-reserved | reserved
ADMIN | non-reserved | non-reserved | non-reserved |
AFTER | non-reserved | non-reserved | non-reserved |
AGGREGATE | non-reserved |  |  |
ALL | reserved | reserved | reserved | reserved
ALLOCATE |  | reserved | reserved | reserved
ALSO | non-reserved |  |  |
ALTER | non-reserved | reserved | reserved | reserved
ALWAYS | non-reserved | non-reserved | non-reserved |
ANALYSE | reserved |  |  |
ANALYZE | reserved |  |  |
AND | reserved | reserved | reserved | reserved
ANY | reserved | reserved | reserved | reserved
ARE |  | reserved | reserved | reserved
ARRAY | reserved | reserved | reserved |
ARRAY_AGG |  | reserved | reserved |
ARRAY_MAX_CARDINALITY |  | reserved | reserved |
AS | reserved | reserved | reserved | reserved
ASC | reserved | non-reserved | non-reserved | reserved
ASENSITIVE |  | reserved | reserved |
ASIN |  | reserved |  |
ASSERTION | non-reserved | non-reserved | non-reserved | reserved
ASSIGNMENT | non-reserved | non-reserved | non-reserved |
ASYMMETRIC | reserved | reserved | reserved |
AT | non-reserved | reserved | reserved | reserved
ATAN |  | reserved |  |
ATOMIC |  | reserved | reserved |
ATTACH | non-reserved |  |  |
ATTRIBUTE | non-reserved | non-reserved | non-reserved |
ATTRIBUTES |  | non-reserved | non-reserved |
AUTHORIZATION | reserved (can be function or type) | reserved | reserved | reserved
AVG |  | reserved | reserved | reserved
BACKWARD | non-reserved |  |  |
BASE64 |  | non-reserved | non-reserved |
BEFORE | non-reserved | non-reserved | non-reserved |
BEGIN | non-reserved | reserved | reserved | reserved
BEGIN_FRAME |  | reserved | reserved |
BEGIN_PARTITION |  | reserved | reserved |
BERNOULLI |  | non-reserved | non-reserved |
BETWEEN | non-reserved (cannot be function or type) | reserved | reserved | reserved
BIGINT | non-reserved (cannot be function or type) | reserved | reserved |
BINARY | reserved (can be function or type) | reserved | reserved |
BIT | non-reserved (cannot be function or type) |  |  | reserved
BIT_LENGTH |  |  |  | reserved
BLOB |  | reserved | reserved |
BLOCKED |  | non-reserved | non-reserved |
BOM |  | non-reserved | non-reserved |
BOOLEAN | non-reserved (cannot be function or type) | reserved | reserved |
BOTH | reserved | reserved | reserved | reserved
BREADTH |  | non-reserved | non-reserved |
BY | non-reserved | reserved | reserved | reserved
C |  | non-reserved | non-reserved | non-reserved
CACHE | non-reserved |  |  |
CALL | non-reserved | reserved | reserved |
CALLED | non-reserved | reserved | reserved |
CARDINALITY |  | reserved | reserved |
CASCADE | non-reserved | non-reserved | non-reserved | reserved
CASCADED | non-reserved | reserved | reserved | reserved
CASE | reserved | reserved | reserved | reserved
CAST | reserved | reserved | reserved | reserved
CATALOG | non-reserved | non-reserved | non-reserved | reserved
CATALOG_NAME |  | non-reserved | non-reserved | non-reserved
CEIL |  | reserved | reserved |
CEILING |  | reserved | reserved |
CHAIN | non-reserved | non-reserved | non-reserved |
CHAINING |  | non-reserved |  |
CHAR | non-reserved (cannot be function or type) | reserved | reserved | reserved
CHARACTER | non-reserved (cannot be function or type) | reserved | reserved | reserved
CHARACTERISTICS | non-reserved | non-reserved | non-reserved |
CHARACTERS |  | non-reserved | non-reserved |
CHARACTER_LENGTH |  | reserved | reserved | reserved
CHARACTER_SET_CATALOG |  | non-reserved | non-reserved | non-reserved
CHARACTER_SET_NAME |  | non-reserved | non-reserved | non-reserved
CHARACTER_SET_SCHEMA |  | non-reserved | non-reserved | non-reserved
CHAR_LENGTH |  | reserved | reserved | reserved
CHECK | reserved | reserved | reserved | reserved
CHECKPOINT | non-reserved |  |  |
CLASS | non-reserved |  |  |
CLASSIFIER |  | reserved |  |
CLASS_ORIGIN |  | non-reserved | non-reserved | non-reserved
CLOB |  | reserved | reserved |
CLOSE | non-reserved | reserved | reserved | reserved
CLUSTER | non-reserved |  |  |
COALESCE | non-reserved (cannot be function or type) | reserved | reserved | reserved
COBOL |  | non-reserved | non-reserved | non-reserved
COLLATE | reserved | reserved | reserved | reserved
COLLATION | reserved (can be function or type) | non-reserved | non-reserved | reserved
COLLATION_CATALOG |  | non-reserved | non-reserved | non-reserved
COLLATION_NAME |  | non-reserved | non-reserved | non-reserved
COLLATION_SCHEMA |  | non-reserved | non-reserved | non-reserved
COLLECT |  | reserved | reserved |
COLUMN | reserved | reserved | reserved | reserved
COLUMNS | non-reserved | non-reserved | non-reserved |
COLUMN_NAME |  | non-reserved | non-reserved | non-reserved
COMMAND_FUNCTION |  | non-reserved | non-reserved | non-reserved
COMMAND_FUNCTION_CODE |  | non-reserved | non-reserved |
COMMENT | non-reserved |  |  |
COMMENTS | non-reserved |  |  |
COMMIT | non-reserved | reserved | reserved | reserved
COMMITTED | non-reserved | non-reserved | non-reserved | non-reserved
CONCURRENTLY | reserved (can be function or type) |  |  |
CONDITION |  | reserved | reserved |
CONDITIONAL |  | non-reserved |  |
CONDITION_NUMBER |  | non-reserved | non-reserved | non-reserved
CONFIGURATION | non-reserved |  |  |
CONFLICT | non-reserved |  |  |
CONNECT |  | reserved | reserved | reserved
CONNECTION | non-reserved | non-reserved | non-reserved | reserved
CONNECTION_NAME |  | non-reserved | non-reserved | non-reserved
CONSTRAINT | reserved | reserved | reserved | reserved
CONSTRAINTS | non-reserved | non-reserved | non-reserved | reserved
CONSTRAINT_CATALOG |  | non-reserved | non-reserved | non-reserved
CONSTRAINT_NAME |  | non-reserved | non-reserved | non-reserved
CONSTRAINT_SCHEMA |  | non-reserved | non-reserved | non-reserved
CONSTRUCTOR |  | non-reserved | non-reserved |
CONTAINS |  | reserved | reserved |
CONTENT | non-reserved | non-reserved | non-reserved |
CONTINUE | non-reserved | non-reserved | non-reserved | reserved
CONTROL |  | non-reserved | non-reserved |
CONVERSION | non-reserved |  |  |
CONVERT |  | reserved | reserved | reserved
COPY | non-reserved | reserved |  |
CORR |  | reserved | reserved |
CORRESPONDING |  | reserved | reserved | reserved
COS |  | reserved |  |
COSH |  | reserved |  |
COST | non-reserved |  |  |
COUNT |  | reserved | reserved | reserved
COVAR_POP |  | reserved | reserved |
COVAR_SAMP |  | reserved | reserved |
CREATE | reserved | reserved | reserved | reserved
CROSS | reserved (can be function or type) | reserved | reserved | reserved
CSV | non-reserved |  |  |
CUBE | non-reserved | reserved | reserved |
CUME_DIST |  | reserved | reserved |
CURRENT | non-reserved | reserved | reserved | reserved
CURRENT_CATALOG | reserved | reserved | reserved |
CURRENT_DATE | reserved | reserved | reserved | reserved
CURRENT_DEFAULT_TRANSFORM_GROUP |  | reserved | reserved |
CURRENT_PATH |  | reserved | reserved |
CURRENT_ROLE | reserved | reserved | reserved |
CURRENT_ROW |  | reserved | reserved |
CURRENT_SCHEMA | reserved (can be function or type) | reserved | reserved |
CURRENT_TIME | reserved | reserved | reserved | reserved
CURRENT_TIMESTAMP | reserved | reserved | reserved | reserved
CURRENT_TRANSFORM_GROUP_FOR_TYPE |  | reserved | reserved |
CURRENT_USER | reserved | reserved | reserved | reserved
CURSOR | non-reserved | reserved | reserved | reserved
CURSOR_NAME |  | non-reserved | non-reserved | non-reserved
CYCLE | non-reserved | reserved | reserved |
DATA | non-reserved | non-reserved | non-reserved | non-reserved
DATABASE | non-reserved |  |  |
DATALINK |  | reserved | reserved |
DATE |  | reserved | reserved | reserved
DATETIME_INTERVAL_CODE |  | non-reserved | non-reserved | non-reserved
DATETIME_INTERVAL_PRECISION |  | non-reserved | non-reserved | non-reserved
DAY | non-reserved | reserved | reserved | reserved
DB |  | non-reserved | non-reserved |
DEALLOCATE | non-reserved | reserved | reserved | reserved
DEC | non-reserved (cannot be function or type) | reserved | reserved | reserved
DECFLOAT |  | reserved |  |
DECIMAL | non-reserved (cannot be function or type) | reserved | reserved | reserved
DECLARE | non-reserved | reserved | reserved | reserved
DEFAULT | reserved | reserved | reserved | reserved
DEFAULTS | non-reserved | non-reserved | non-reserved |
DEFERRABLE | reserved | non-reserved | non-reserved | reserved
DEFERRED | non-reserved | non-reserved | non-reserved | reserved
DEFINE |  | reserved |  |
DEFINED |  | non-reserved | non-reserved |
DEFINER | non-reserved | non-reserved | non-reserved |
DEGREE |  | non-reserved | non-reserved |
DELETE | non-reserved | reserved | reserved | reserved
DELIMITER | non-reserved |  |  |
DELIMITERS | non-reserved |  |  |
DENSE_RANK |  | reserved | reserved |
DEPENDS | non-reserved |  |  |
DEPTH |  | non-reserved | non-reserved |
DEREF |  | reserved | reserved |
DERIVED |  | non-reserved | non-reserved |
DESC | reserved | non-reserved | non-reserved | reserved
DESCRIBE |  | reserved | reserved | reserved
DESCRIPTOR |  | non-reserved | non-reserved | reserved
DETACH | non-reserved |  |  |
DETERMINISTIC |  | reserved | reserved |
DIAGNOSTICS |  | non-reserved | non-reserved | reserved
DICTIONARY | non-reserved |  |  |
DISABLE | non-reserved |  |  |
DISCARD | non-reserved |  |  |
DISCONNECT |  | reserved | reserved | reserved
DISPATCH |  | non-reserved | non-reserved |
DISTINCT | reserved | reserved | reserved | reserved
DLNEWCOPY |  | reserved | reserved |
DLPREVIOUSCOPY |  | reserved | reserved |
DLURLCOMPLETE |  | reserved | reserved |
DLURLCOMPLETEONLY |  | reserved | reserved |
DLURLCOMPLETEWRITE |  | reserved | reserved |
DLURLPATH |  | reserved | reserved |
DLURLPATHONLY |  | reserved | reserved |
DLURLPATHWRITE |  | reserved | reserved |
DLURLSCHEME |  | reserved | reserved |
DLURLSERVER |  | reserved | reserved |
DLVALUE |  | reserved | reserved |
DO | reserved |  |  |
DOCUMENT | non-reserved | non-reserved | non-reserved |
DOMAIN | non-reserved | non-reserved | non-reserved | reserved
DOUBLE | non-reserved | reserved | reserved | reserved
DROP | non-reserved | reserved | reserved | reserved
DYNAMIC |  | reserved | reserved |
DYNAMIC_FUNCTION |  | non-reserved | non-reserved | non-reserved
DYNAMIC_FUNCTION_CODE |  | non-reserved | non-reserved |
EACH | non-reserved | reserved | reserved |
ELEMENT |  | reserved | reserved |
ELSE | reserved | reserved | reserved | reserved
EMPTY |  | reserved | non-reserved |
ENABLE | non-reserved |  |  |
ENCODING | non-reserved | non-reserved | non-reserved |
ENCRYPTED | non-reserved |  |  |
END | reserved | reserved | reserved | reserved
END-EXEC |  | reserved | reserved | reserved
END_FRAME |  | reserved | reserved |
END_PARTITION |  | reserved | reserved |
ENFORCED |  | non-reserved | non-reserved |
ENUM | non-reserved |  |  |
EQUALS |  | reserved | reserved |
ERROR |  | non-reserved |  |
ESCAPE | non-reserved | reserved | reserved | reserved
EVENT | non-reserved |  |  |
EVERY |  | reserved | reserved |
EXCEPT | reserved | reserved | reserved | reserved
EXCEPTION |  |  |  | reserved
EXCLUDE | non-reserved | non-reserved | non-reserved |
EXCLUDING | non-reserved | non-reserved | non-reserved |
EXCLUSIVE | non-reserved |  |  |
EXEC |  | reserved | reserved | reserved
EXECUTE | non-reserved | reserved | reserved | reserved
EXISTS | non-reserved (cannot be function or type) | reserved | reserved | reserved
EXP |  | reserved | reserved |
EXPLAIN | non-reserved |  |  |
EXPRESSION |  | non-reserved | non-reserved |
EXTENSION | non-reserved |  |  |
EXTERNAL | non-reserved | reserved | reserved | reserved
EXTRACT | non-reserved (cannot be function or type) | reserved | reserved | reserved
FALSE | reserved | reserved | reserved | reserved
FAMILY | non-reserved |  |  |
FETCH | reserved | reserved | reserved | reserved
FILE |  | non-reserved | non-reserved |
FILTER | non-reserved | reserved | reserved |
FINAL |  | non-reserved | non-reserved |
FINISH |  | non-reserved |  |
FIRST | non-reserved | non-reserved | non-reserved | reserved
FIRST_VALUE |  | reserved | reserved |
FLAG |  | non-reserved | non-reserved |
FLOAT | non-reserved (cannot be function or type) | reserved | reserved | reserved
FLOOR |  | reserved | reserved |
FOLLOWING | non-reserved | non-reserved | non-reserved |
FOR | reserved | reserved | reserved | reserved
FORCE | non-reserved |  |  |
FOREIGN | reserved | reserved | reserved | reserved
FORMAT |  | non-reserved |  |
FORTRAN |  | non-reserved | non-reserved | non-reserved
FORWARD | non-reserved |  |  |
FOUND |  | non-reserved | non-reserved | reserved
FRAME_ROW |  | reserved | reserved |
FREE |  | reserved | reserved |
FREEZE | reserved (can be function or type) |  |  |
FROM | reserved | reserved | reserved | reserved
FS |  | non-reserved | non-reserved |
FULFILL |  | non-reserved |  |
FULL | reserved (can be function or type) | reserved | reserved | reserved
FUNCTION | non-reserved | reserved | reserved |
FUNCTIONS | non-reserved |  |  |
FUSION |  | reserved | reserved |
G |  | non-reserved | non-reserved |
GENERAL |  | non-reserved | non-reserved |
GENERATED | non-reserved | non-reserved | non-reserved |
GET |  | reserved | reserved | reserved
GLOBAL | non-reserved | reserved | reserved | reserved
GO |  | non-reserved | non-reserved | reserved
GOTO |  | non-reserved | non-reserved | reserved
GRANT | reserved | reserved | reserved | reserved
GRANTED | non-reserved | non-reserved | non-reserved |
GREATEST | non-reserved (cannot be function or type) |  |  |
GROUP | reserved | reserved | reserved | reserved
GROUPING | non-reserved (cannot be function or type) | reserved | reserved |
GROUPS | non-reserved | reserved | reserved |
HANDLER | non-reserved |  |  |
HAVING | reserved | reserved | reserved | reserved
HEADER | non-reserved |  |  |
HEX |  | non-reserved | non-reserved |
HIERARCHY |  | non-reserved | non-reserved |
HOLD | non-reserved | reserved | reserved |
HOUR | non-reserved | reserved | reserved | reserved
ID |  | non-reserved | non-reserved |
IDENTITY | non-reserved | reserved | reserved | reserved
IF | non-reserved |  |  |
IGNORE |  | non-reserved | non-reserved |
ILIKE | reserved (can be function or type) |  |  |
IMMEDIATE | non-reserved | non-reserved | non-reserved | reserved
IMMEDIATELY |  | non-reserved | non-reserved |
IMMUTABLE | non-reserved |  |  |
IMPLEMENTATION |  | non-reserved | non-reserved |
IMPLICIT | non-reserved |  |  |
IMPORT | non-reserved | reserved | reserved |
IN | reserved | reserved | reserved | reserved
INCLUDE | non-reserved |  |  |
INCLUDING | non-reserved | non-reserved | non-reserved |
INCREMENT | non-reserved | non-reserved | non-reserved |
INDENT |  | non-reserved | non-reserved |
INDEX | non-reserved |  |  |
INDEXES | non-reserved |  |  |
INDICATOR |  | reserved | reserved | reserved
INHERIT | non-reserved |  |  |
INHERITS | non-reserved |  |  |
INITIAL |  | reserved |  |
INITIALLY | reserved | non-reserved | non-reserved | reserved
INLINE | non-reserved |  |  |
INNER | reserved (can be function or type) | reserved | reserved | reserved
INOUT | non-reserved (cannot be function or type) | reserved | reserved |
INPUT | non-reserved | non-reserved | non-reserved | reserved
INSENSITIVE | non-reserved | reserved | reserved | reserved
INSERT | non-reserved | reserved | reserved | reserved
INSTANCE |  | non-reserved | non-reserved |
INSTANTIABLE |  | non-reserved | non-reserved |
INSTEAD | non-reserved | non-reserved | non-reserved |
INT | non-reserved (cannot be function or type) | reserved | reserved | reserved
INTEGER | non-reserved (cannot be function or type) | reserved | reserved | reserved
INTEGRITY |  | non-reserved | non-reserved |
INTERSECT | reserved | reserved | reserved | reserved
INTERSECTION |  | reserved | reserved |
INTERVAL | non-reserved (cannot be function or type) | reserved | reserved | reserved
INTO | reserved | reserved | reserved | reserved
INVOKER | non-reserved | non-reserved | non-reserved |
IS | reserved (can be function or type) | reserved | reserved | reserved
ISNULL | reserved (can be function or type) |  |  |
ISOLATION | non-reserved | non-reserved | non-reserved | reserved
JOIN | reserved (can be function or type) | reserved | reserved | reserved
JSON |  | non-reserved |  |
JSON_ARRAY |  | reserved |  |
JSON_ARRAYAGG |  | reserved |  |
JSON_EXISTS |  | reserved |  |
JSON_OBJECT |  | reserved |  |
JSON_OBJECTAGG |  | reserved |  |
JSON_QUERY |  | reserved |  |
JSON_TABLE |  | reserved |  |
JSON_TABLE_PRIMITIVE |  | reserved |  |
JSON_VALUE |  | reserved |  |
K |  | non-reserved | non-reserved |
KEEP |  | non-reserved |  |
KEY | non-reserved | non-reserved | non-reserved | reserved
KEYS |  | non-reserved |  |
KEY_MEMBER |  | non-reserved | non-reserved |
KEY_TYPE |  | non-reserved | non-reserved |
LABEL | non-reserved |  |  |
LAG |  | reserved | reserved |
LANGUAGE | non-reserved | reserved | reserved | reserved
LARGE | non-reserved | reserved | reserved |
LAST | non-reserved | non-reserved | non-reserved | reserved
LAST_VALUE |  | reserved | reserved |
LATERAL | reserved | reserved | reserved |
LEAD |  | reserved | reserved |
LEADING | reserved | reserved | reserved | reserved
LEAKPROOF | non-reserved |  |  |
LEAST | non-reserved (cannot be function or type) |  |  |
LEFT | reserved (can be function or type) | reserved | reserved | reserved
LENGTH |  | non-reserved | non-reserved | non-reserved
LEVEL | non-reserved | non-reserved | non-reserved | reserved
LIBRARY |  | non-reserved | non-reserved |
LIKE | reserved (can be function or type) | reserved | reserved | reserved
LIKE_REGEX |  | reserved | reserved |
LIMIT | reserved | non-reserved | non-reserved |
LINK |  | non-reserved | non-reserved |
LISTAGG |  | reserved |  |
LISTEN | non-reserved |  |  |
LN |  | reserved | reserved |
LOAD | non-reserved |  |  |
LOCAL | non-reserved | reserved | reserved | reserved
LOCALTIME | reserved | reserved | reserved |
LOCALTIMESTAMP | reserved | reserved | reserved |
LOCATION | non-reserved | non-reserved | non-reserved |
LOCATOR |  | non-reserved | non-reserved |
LOCK | non-reserved |  |  |
LOCKED | non-reserved |  |  |
LOG |  | reserved |  |
LOG10 |  | reserved |  |
LOGGED | non-reserved |  |  |
LOWER |  | reserved | reserved | reserved
M |  | non-reserved | non-reserved |
MAP |  | non-reserved | non-reserved |
MAPPING | non-reserved | non-reserved | non-reserved |
MATCH | non-reserved | reserved | reserved | reserved
MATCHED |  | non-reserved | non-reserved |
MATCHES |  | reserved |  |
MATCH_NUMBER |  | reserved |  |
MATCH_RECOGNIZE |  | reserved |  |
MATERIALIZED | non-reserved |  |  |
MAX |  | reserved | reserved | reserved
MAXVALUE | non-reserved | non-reserved | non-reserved |
MEASURES |  | reserved |  |
MEMBER |  | reserved | reserved |
MERGE |  | reserved | reserved |
MESSAGE_LENGTH |  | non-reserved | non-reserved | non-reserved
MESSAGE_OCTET_LENGTH |  | non-reserved | non-reserved | non-reserved
MESSAGE_TEXT |  | non-reserved | non-reserved | non-reserved
METHOD | non-reserved | reserved | reserved |
MIN |  | reserved | reserved | reserved
MINUTE | non-reserved | reserved | reserved | reserved
MINVALUE | non-reserved | non-reserved | non-reserved |
MOD |  | reserved | reserved |
MODE | non-reserved |  |  |
MODIFIES |  | reserved | reserved |
MODULE |  | reserved | reserved | reserved
MONTH | non-reserved | reserved | reserved | reserved
MORE |  | non-reserved | non-reserved | non-reserved
MOVE | non-reserved |  |  |
MULTISET |  | reserved | reserved |
MUMPS |  | non-reserved | non-reserved | non-reserved
NAME | non-reserved | non-reserved | non-reserved | non-reserved
NAMES | non-reserved | non-reserved | non-reserved | reserved
NAMESPACE |  | non-reserved | non-reserved |
NATIONAL | non-reserved (cannot be function or type) | reserved | reserved | reserved
NATURAL | reserved (can be function or type) | reserved | reserved | reserved
NCHAR | non-reserved (cannot be function or type) | reserved | reserved | reserved
NCLOB |  | reserved | reserved |
NESTED |  | non-reserved |  |
NESTING |  | non-reserved | non-reserved |
NEW | non-reserved | reserved | reserved |
NEXT | non-reserved | non-reserved | non-reserved | reserved
NFC |  | non-reserved | non-reserved |
NFD |  | non-reserved | non-reserved |
NFKC |  | non-reserved | non-reserved |
NFKD |  | non-reserved | non-reserved |
NIL |  | non-reserved | non-reserved |
NO | non-reserved | reserved | reserved | reserved
NONE | non-reserved (cannot be function or type) | reserved | reserved |
NORMALIZE |  | reserved | reserved |
NORMALIZED |  | non-reserved | non-reserved |
NOT | reserved | reserved | reserved | reserved
NOTHING | non-reserved |  |  |
NOTIFY | non-reserved |  |  |
NOTNULL | reserved (can be function or type) |  |  |
NOWAIT | non-reserved |  |  |
NTH_VALUE |  | reserved | reserved |
NTILE |  | reserved | reserved |
NULL | reserved | reserved | reserved | reserved
NULLABLE |  | non-reserved | non-reserved | non-reserved
NULLIF | non-reserved (cannot be function or type) | reserved | reserved | reserved
NULLS | non-reserved | non-reserved | non-reserved |
NUMBER |  | non-reserved | non-reserved | non-reserved
NUMERIC | non-reserved (cannot be function or type) | reserved | reserved | reserved
OBJECT | non-reserved | non-reserved | non-reserved |
OCCURRENCES_REGEX |  | reserved | reserved |
OCTETS |  | non-reserved | non-reserved |
OCTET_LENGTH |  | reserved | reserved | reserved
OF | non-reserved | reserved | reserved | reserved
OFF | non-reserved | non-reserved | non-reserved |
OFFSET | reserved | reserved | reserved |
OIDS | non-reserved |  |  |
OLD | non-reserved | reserved | reserved |
OMIT |  | reserved |  |
ON | reserved | reserved | reserved | reserved
ONE |  | reserved |  |
ONLY | reserved | reserved | reserved | reserved
OPEN |  | reserved | reserved | reserved
OPERATOR | non-reserved |  |  |
OPTION | non-reserved | non-reserved | non-reserved | reserved
OPTIONS | non-reserved | non-reserved | non-reserved |
OR | reserved | reserved | reserved | reserved
ORDER | reserved | reserved | reserved | reserved
ORDERING |  | non-reserved | non-reserved |
ORDINALITY | non-reserved | non-reserved | non-reserved |
OTHERS | non-reserved | non-reserved | non-reserved |
OUT | non-reserved (cannot be function or type) | reserved | reserved |
OUTER | reserved (can be function or type) | reserved | reserved | reserved
OUTPUT |  | non-reserved | non-reserved | reserved
OVER | non-reserved | reserved | reserved |
OVERFLOW |  | non-reserved |  |
OVERLAPS | reserved (can be function or type) | reserved | reserved | reserved
OVERLAY | non-reserved (cannot be function or type) | reserved | reserved |
OVERRIDING | non-reserved | non-reserved | non-reserved |
OWNED | non-reserved |  |  |
OWNER | non-reserved |  |  |
P |  | non-reserved | non-reserved |
PAD |  | non-reserved | non-reserved | reserved
PARALLEL | non-reserved |  |  |
PARAMETER |  | reserved | reserved |
PARAMETER_MODE |  | non-reserved | non-reserved |
PARAMETER_NAME |  | non-reserved | non-reserved |
PARAMETER_ORDINAL_POSITION |  | non-reserved | non-reserved |
PARAMETER_SPECIFIC_CATALOG |  | non-reserved | non-reserved |
PARAMETER_SPECIFIC_NAME |  | non-reserved | non-reserved |
PARAMETER_SPECIFIC_SCHEMA |  | non-reserved | non-reserved |
PARSER | non-reserved |  |  |
PARTIAL | non-reserved | non-reserved | non-reserved | reserved
PARTITION | non-reserved | reserved | reserved |
PASCAL |  | non-reserved | non-reserved | non-reserved
PASS |  | non-reserved |  |
PASSING | non-reserved | non-reserved | non-reserved |
PASSTHROUGH |  | non-reserved | non-reserved |
PASSWORD | non-reserved |  |  |
PAST |  | non-reserved |  |
PATH |  | non-reserved | non-reserved |
PATTERN |  | reserved |  |
PER |  | reserved |  |
PERCENT |  | reserved | reserved |
PERCENTILE_CONT |  | reserved | reserved |
PERCENTILE_DISC |  | reserved | reserved |
PERCENT_RANK |  | reserved | reserved |
PERIOD |  | reserved | reserved |
PERMISSION |  | non-reserved | non-reserved |
PERMUTE |  | reserved |  |
PLACING | reserved | non-reserved | non-reserved |
PLAN |  | non-reserved |  |
PLANS | non-reserved |  |  |
PLI |  | non-reserved | non-reserved | non-reserved
POLICY | non-reserved |  |  |
PORTION |  | reserved | reserved |
POSITION | non-reserved (cannot be function or type) | reserved | reserved | reserved
POSITION_REGEX |  | reserved | reserved |
POWER |  | reserved | reserved |
PRECEDES |  | reserved | reserved |
PRECEDING | non-reserved | non-reserved | non-reserved |
PRECISION | non-reserved (cannot be function or type) | reserved | reserved | reserved
PREPARE | non-reserved | reserved | reserved | reserved
PREPARED | non-reserved |  |  |
PRESERVE | non-reserved | non-reserved | non-reserved | reserved
PRIMARY | reserved | reserved | reserved | reserved
PRIOR | non-reserved | non-reserved | non-reserved | reserved
PRIVATE |  | non-reserved |  |
PRIVILEGES | non-reserved | non-reserved | non-reserved | reserved
PROCEDURAL | non-reserved |  |  |
PROCEDURE | non-reserved | reserved | reserved | reserved
PROCEDURES | non-reserved |  |  |
PROGRAM | non-reserved |  |  |
PRUNE |  | non-reserved |  |
PTF |  | reserved |  |
PUBLIC |  | non-reserved | non-reserved | reserved
PUBLICATION | non-reserved |  |  |
QUOTE | non-reserved |  |  |
QUOTES |  | non-reserved |  |
RANGE | non-reserved | reserved | reserved |
RANK |  | reserved | reserved |
READ | non-reserved | non-reserved | non-reserved | reserved
READS |  | reserved | reserved |
REAL | non-reserved (cannot be function or type) | reserved | reserved | reserved
REASSIGN | non-reserved |  |  |
RECHECK | non-reserved |  |  |
RECOVERY |  | non-reserved | non-reserved |
RECURSIVE | non-reserved | reserved | reserved |
REF | non-reserved | reserved | reserved |
REFERENCES | reserved | reserved | reserved | reserved
REFERENCING | non-reserved | reserved | reserved |
REFRESH | non-reserved |  |  |
REGR_AVGX |  | reserved | reserved |
REGR_AVGY |  | reserved | reserved |
REGR_COUNT |  | reserved | reserved |
REGR_INTERCEPT |  | reserved | reserved |
REGR_R2 |  | reserved | reserved |
REGR_SLOPE |  | reserved | reserved |
REGR_SXX |  | reserved | reserved |
REGR_SXY |  | reserved | reserved |
REGR_SYY |  | reserved | reserved |
REINDEX | non-reserved |  |  |
RELATIVE | non-reserved | non-reserved | non-reserved | reserved
RELEASE | non-reserved | reserved | reserved |
RENAME | non-reserved |  |  |
REPEATABLE | non-reserved | non-reserved | non-reserved | non-reserved
REPLACE | non-reserved |  |  |
REPLICA | non-reserved |  |  |
REQUIRING |  | non-reserved | non-reserved |
RESET | non-reserved |  |  |
RESPECT |  | non-reserved | non-reserved |
RESTART | non-reserved | non-reserved | non-reserved |
RESTORE |  | non-reserved | non-reserved |
RESTRICT | non-reserved | non-reserved | non-reserved | reserved
RESULT |  | reserved | reserved |
RETURN |  | reserved | reserved |
RETURNED_CARDINALITY |  | non-reserved | non-reserved |
RETURNED_LENGTH |  | non-reserved | non-reserved | non-reserved
RETURNED_OCTET_LENGTH |  | non-reserved | non-reserved | non-reserved
RETURNED_SQLSTATE |  | non-reserved | non-reserved | non-reserved
RETURNING | reserved | non-reserved | non-reserved |
RETURNS | non-reserved | reserved | reserved |
REVOKE | non-reserved | reserved | reserved | reserved
RIGHT | reserved (can be function or type) | reserved | reserved | reserved
ROLE | non-reserved | non-reserved | non-reserved |
ROLLBACK | non-reserved | reserved | reserved | reserved
ROLLUP | non-reserved | reserved | reserved |
ROUTINE | non-reserved | non-reserved | non-reserved |
ROUTINES | non-reserved |  |  |
ROUTINE_CATALOG |  | non-reserved | non-reserved |
ROUTINE_NAME |  | non-reserved | non-reserved |
ROUTINE_SCHEMA |  | non-reserved | non-reserved |
ROW | non-reserved (cannot be function or type) | reserved | reserved |
ROWS | non-reserved | reserved | reserved | reserved
ROW_COUNT |  | non-reserved | non-reserved | non-reserved
ROW_NUMBER |  | reserved | reserved |
RULE | non-reserved |  |  |
RUNNING |  | reserved |  |
SAVEPOINT | non-reserved | reserved | reserved |
SCALAR |  | non-reserved |  |
SCALE |  | non-reserved | non-reserved | non-reserved
SCHEMA | non-reserved | non-reserved | non-reserved | reserved
SCHEMAS | non-reserved |  |  |
SCHEMA_NAME |  | non-reserved | non-reserved | non-reserved
SCOPE |  | reserved | reserved |
SCOPE_CATALOG |  | non-reserved | non-reserved |
SCOPE_NAME |  | non-reserved | non-reserved |
SCOPE_SCHEMA |  | non-reserved | non-reserved |
SCROLL | non-reserved | reserved | reserved | reserved
SEARCH | non-reserved | reserved | reserved |
SECOND | non-reserved | reserved | reserved | reserved
SECTION |  | non-reserved | non-reserved | reserved
SECURITY | non-reserved | non-reserved | non-reserved |
SEEK |  | reserved |  |
SELECT | reserved | reserved | reserved | reserved
SELECTIVE |  | non-reserved | non-reserved |
SELF |  | non-reserved | non-reserved |
SENSITIVE |  | reserved | reserved |
SEQUENCE | non-reserved | non-reserved | non-reserved |
SEQUENCES | non-reserved |  |  |
SERIALIZABLE | non-reserved | non-reserved | non-reserved | non-reserved
SERVER | non-reserved | non-reserved | non-reserved |
SERVER_NAME |  | non-reserved | non-reserved | non-reserved
SESSION | non-reserved | non-reserved | non-reserved | reserved
SESSION_USER | reserved | reserved | reserved | reserved
SET | non-reserved | reserved | reserved | reserved
SETOF | non-reserved (cannot be function or type) |  |  |
SETS | non-reserved | non-reserved | non-reserved |
SHARE | non-reserved |  |  |
SHOW | non-reserved | reserved |  |
SIMILAR | reserved (can be function or type) | reserved | reserved |
SIMPLE | non-reserved | non-reserved | non-reserved |
SIN |  | reserved |  |
SINH |  | reserved |  |
SIZE |  | non-reserved | non-reserved | reserved
SKIP | non-reserved | reserved |  |
SMALLINT | non-reserved (cannot be function or type) | reserved | reserved | reserved
SNAPSHOT | non-reserved |  |  |
SOME | reserved | reserved | reserved | reserved
SOURCE |  | non-reserved | non-reserved |
SPACE |  | non-reserved | non-reserved | reserved
SPECIFIC |  | reserved | reserved |
SPECIFICTYPE |  | reserved | reserved |
SPECIFIC_NAME |  | non-reserved | non-reserved |
SQL | non-reserved | reserved | reserved | reserved
SQLCODE |  |  |  | reserved
SQLERROR |  |  |  | reserved
SQLEXCEPTION |  | reserved | reserved |
SQLSTATE |  | reserved | reserved | reserved
SQLWARNING |  | reserved | reserved |
SQRT |  | reserved | reserved |
STABLE | non-reserved |  |  |
STANDALONE | non-reserved | non-reserved | non-reserved |
START | non-reserved | reserved | reserved |
STATE |  | non-reserved | non-reserved |
STATEMENT | non-reserved | non-reserved | non-reserved |
STATIC |  | reserved | reserved |
STATISTICS | non-reserved |  |  |
STDDEV_POP |  | reserved | reserved |
STDDEV_SAMP |  | reserved | reserved |
STDIN | non-reserved |  |  |
STDOUT | non-reserved |  |  |
STORAGE | non-reserved |  |  |
STORED | non-reserved |  |  |
STRICT | non-reserved |  |  |
STRING |  | non-reserved |  |
STRIP | non-reserved | non-reserved | non-reserved |
STRUCTURE |  | non-reserved | non-reserved |
STYLE |  | non-reserved | non-reserved |
SUBCLASS_ORIGIN |  | non-reserved | non-reserved | non-reserved
SUBMULTISET |  | reserved | reserved |
SUBSCRIPTION | non-reserved |  |  |
SUBSET |  | reserved |  |
SUBSTRING | non-reserved (cannot be function or type) | reserved | reserved | reserved
SUBSTRING_REGEX |  | reserved | reserved |
SUCCEEDS |  | reserved | reserved |
SUM |  | reserved | reserved | reserved
SUPPORT | non-reserved |  |  |
SYMMETRIC | reserved | reserved | reserved |
SYSID | non-reserved |  |  |
SYSTEM | non-reserved | reserved | reserved |
SYSTEM_TIME |  | reserved | reserved |
SYSTEM_USER |  | reserved | reserved | reserved
T |  | non-reserved | non-reserved |
TABLE | reserved | reserved | reserved | reserved
TABLES | non-reserved |  |  |
TABLESAMPLE | reserved (can be function or type) | reserved | reserved |
TABLESPACE | non-reserved |  |  |
TABLE_NAME |  | non-reserved | non-reserved | non-reserved
TAN |  | reserved |  |
TANH |  | reserved |  |
TEMP | non-reserved |  |  |
TEMPLATE | non-reserved |  |  |
TEMPORARY | non-reserved | non-reserved | non-reserved | reserved
TEXT | non-reserved |  |  |
THEN | reserved | reserved | reserved | reserved
THROUGH |  | non-reserved |  |
TIES | non-reserved | non-reserved | non-reserved |
TIME | non-reserved (cannot be function or type) | reserved | reserved | reserved
TIMESTAMP | non-reserved (cannot be function or type) | reserved | reserved | reserved
TIMEZONE_HOUR |  | reserved | reserved | reserved
TIMEZONE_MINUTE |  | reserved | reserved | reserved
TO | reserved | reserved | reserved | reserved
TOKEN |  | non-reserved | non-reserved |
TOP_LEVEL_COUNT |  | non-reserved | non-reserved |
TRAILING | reserved | reserved | reserved | reserved
TRANSACTION | non-reserved | non-reserved | non-reserved | reserved
TRANSACTIONS_COMMITTED |  | non-reserved | non-reserved |
TRANSACTIONS_ROLLED_BACK |  | non-reserved | non-reserved |
TRANSACTION_ACTIVE |  | non-reserved | non-reserved |
TRANSFORM | non-reserved | non-reserved | non-reserved |
TRANSFORMS |  | non-reserved | non-reserved |
TRANSLATE |  | reserved | reserved | reserved
TRANSLATE_REGEX |  | reserved | reserved |
TRANSLATION |  | reserved | reserved | reserved
TREAT | non-reserved (cannot be function or type) | reserved | reserved |
TRIGGER | non-reserved | reserved | reserved |
TRIGGER_CATALOG |  | non-reserved | non-reserved |
TRIGGER_NAME |  | non-reserved | non-reserved |
TRIGGER_SCHEMA |  | non-reserved | non-reserved |
TRIM | non-reserved (cannot be function or type) | reserved | reserved | reserved
TRIM_ARRAY |  | reserved | reserved |
TRUE | reserved | reserved | reserved | reserved
TRUNCATE | non-reserved | reserved | reserved |
TRUSTED | non-reserved |  |  |
TYPE | non-reserved | non-reserved | non-reserved | non-reserved
TYPES | non-reserved |  |  |
UESCAPE |  | reserved | reserved |
UNBOUNDED | non-reserved | non-reserved | non-reserved |
UNCOMMITTED | non-reserved | non-reserved | non-reserved | non-reserved
UNCONDITIONAL |  | non-reserved |  |
UNDER |  | non-reserved | non-reserved |
UNENCRYPTED | non-reserved |  |  |
UNION | reserved | reserved | reserved | reserved
UNIQUE | reserved | reserved | reserved | reserved
UNKNOWN | non-reserved | reserved | reserved | reserved
UNLINK |  | non-reserved | non-reserved |
UNLISTEN | non-reserved |  |  |
UNLOGGED | non-reserved |  |  |
UNMATCHED |  | reserved |  |
UNNAMED |  | non-reserved | non-reserved | non-reserved
UNNEST |  | reserved | reserved |
UNTIL | non-reserved |  |  |
UNTYPED |  | non-reserved | non-reserved |
UPDATE | non-reserved | reserved | reserved | reserved
UPPER |  | reserved | reserved | reserved
URI |  | non-reserved | non-reserved |
USAGE |  | non-reserved | non-reserved | reserved
USER | reserved | reserved | reserved | reserved
USER_DEFINED_TYPE_CATALOG |  | non-reserved | non-reserved |
USER_DEFINED_TYPE_CODE |  | non-reserved | non-reserved |
USER_DEFINED_TYPE_NAME |  | non-reserved | non-reserved |
USER_DEFINED_TYPE_SCHEMA |  | non-reserved | non-reserved |
USING | reserved | reserved | reserved | reserved
UTF16 |  | non-reserved |  |
UTF32 |  | non-reserved |  |
UTF8 |  | non-reserved |  |
VACUUM | non-reserved |  |  |
VALID | non-reserved | non-reserved | non-reserved |
VALIDATE | non-reserved |  |  |
VALIDATOR | non-reserved |  |  |
VALUE | non-reserved | reserved | reserved | reserved
VALUES | non-reserved (cannot be function or type) | reserved | reserved | reserved
VALUE_OF |  | reserved | reserved |
VARBINARY |  | reserved | reserved |
VARCHAR | non-reserved (cannot be function or type) | reserved | reserved | reserved
VARIADIC | reserved |  |  |
VARYING | non-reserved | reserved | reserved | reserved
VAR_POP |  | reserved | reserved |
VAR_SAMP |  | reserved | reserved |
VERBOSE | reserved (can be function or type) |  |  |
VERSION | non-reserved | non-reserved | non-reserved |
VERSIONING |  | reserved | reserved |
VIEW | non-reserved | non-reserved | non-reserved | reserved
VIEWS | non-reserved |  |  |
VOLATILE | non-reserved |  |  |
WHEN | reserved | reserved | reserved | reserved
WHENEVER |  | reserved | reserved | reserved
WHERE | reserved | reserved | reserved | reserved
WHITESPACE | non-reserved | non-reserved | non-reserved |
WIDTH_BUCKET |  | reserved | reserved |
WINDOW | reserved | reserved | reserved |
WITH | reserved | reserved | reserved | reserved
WITHIN | non-reserved | reserved | reserved |
WITHOUT | non-reserved | reserved | reserved |
WORK | non-reserved | non-reserved | non-reserved | reserved
WRAPPER | non-reserved | non-reserved | non-reserved |
WRITE | non-reserved | non-reserved | non-reserved | reserved
XML | non-reserved | reserved | reserved |
XMLAGG |  | reserved | reserved |
XMLATTRIBUTES | non-reserved (cannot be function or type) | reserved | reserved |
XMLBINARY |  | reserved | reserved |
XMLCAST |  | reserved | reserved |
XMLCOMMENT |  | reserved | reserved |
XMLCONCAT | non-reserved (cannot be function or type) | reserved | reserved |
XMLDECLARATION |  | non-reserved | non-reserved |
XMLDOCUMENT |  | reserved | reserved |
XMLELEMENT | non-reserved (cannot be function or type) | reserved | reserved |
XMLEXISTS | non-reserved (cannot be function or type) | reserved | reserved |
XMLFOREST | non-reserved (cannot be function or type) | reserved | reserved |
XMLITERATE |  | reserved | reserved |
XMLNAMESPACES | non-reserved (cannot be function or type) | reserved | reserved |
XMLPARSE | non-reserved (cannot be function or type) | reserved | reserved |
XMLPI | non-reserved (cannot be function or type) | reserved | reserved |
XMLQUERY |  | reserved | reserved |
XMLROOT | non-reserved (cannot be function or type) |  |  |
XMLSCHEMA |  | non-reserved | non-reserved |
XMLSERIALIZE | non-reserved (cannot be function or type) | reserved | reserved |
XMLTABLE | non-reserved (cannot be function or type) | reserved | reserved |
XMLTEXT |  | reserved | reserved |
XMLVALIDATE |  | reserved | reserved |
YEAR | non-reserved | reserved | reserved | reserved
YES | non-reserved | non-reserved | non-reserved |
ZONE | non-reserved | non-reserved | non-reserved | reserved


dblink_get_connections

dblink_get_connections — возвращает имена всех открытых именованных подключений dblink

Синтаксис

dblink_get_connections() returns text[]

Описание

dblink_get_connections возвращает массив имён всех открытых именованных подключений dblink.

Возвращаемое значение

Возвращает текстовый массив имён подключений, либо NULL, если они отсутствуют.

Примеры

SELECT dblink_get_connections();


dblink_get_notify

dblink_get_notify — выдаёт асинхронные уведомления подключения

Синтаксис

dblink_get_notify() returns setof (notify_name text, be_pid int, extra text)
dblink_get_notify(text connname) returns setof (notify_name text, be_pid int, extra text)

Описание

dblink_get_notify выдаёт уведомления либо безымянного подключения, либо подключения с заданным именем. Чтобы получать уведомления через dblink, необходимо сначала выполнить LISTEN, воспользовавшись функцией dblink_exec. За подробностями обратитесь к LISTEN и NOTIFY.

Аргументы

connname

Имя именованного подключения, уведомления которого нужно получить.

Возвращаемое значение

Возвращает setof (notify_name text, be_pid int, extra text) или пустой набор, если уведомлений нет.

Примеры

SELECT dblink_exec('LISTEN virtual');
 dblink_exec
-------------
 LISTEN
(1 row)

SELECT * FROM dblink_get_notify();
 notify_name | be_pid | extra
-------------+--------+-------
(0 rows)

NOTIFY virtual;
NOTIFY

SELECT * FROM dblink_get_notify();
 notify_name | be_pid | extra
-------------+--------+-------
 virtual     |   1229 |
(1 row)


Приложение L. Сокращения

Ниже перечислены сокращения, часто используемые в документации PostgreSQL, и в обсуждениях, связанных с PostgreSQL.

ANSI

American National Standards Institute, Американский национальный институт стандартов

API

Application Programming Interface, Интерфейс программирования приложений

ASCII

American Standard Code for Information Interchange, Американский стандартный код для обмена информацией

BKI

Backend Interface, Внутренний интерфейс

CA

Certificate Authority, Центр сертификации

CIDR

Classless Inter-Domain Routing, Бесклассовая междоменная маршрутизация

CPAN

Comprehensive Perl Archive Network, Всеобъемлющая сеть архивов Perl

CRL

Certificate Revocation List, Список отозванных сертификатов

CSV

Comma Separated Values, Значения, разделённые запятыми

CTE

Common Table Expression, Общее табличное выражение

CVE

Common Vulnerabilities and Exposures, Общие уязвимости и риски

DBA

Database Administrator, Администратор баз данных

DBI

Database Interface (Perl), Интерфейс баз данных (Perl)

DBMS

Database Management System, Система управления базами данных

DDL

Data Definition Language, Язык описания данных, включающий такие команды SQL, как CREATE TABLE, ALTER USER

DML

Data Manipulation Language, Язык обработки данных, включающий такие SQL-команды, как INSERT, UPDATE, DELETE

DST

Daylight Saving Time, Летнее время

ECPG

Embedded C for PostgreSQL, Встроенный C для PostgreSQL

ESQL

Embedded SQL, Встраиваемый SQL

FAQ

Frequently Asked Questions, Часто задаваемые вопросы

FSM

Free Space Map, Карта свободного пространства

GEQO

Genetic Query Optimizer, Генетический оптимизатор запросов

GIN

Generalized Inverted Index, Обобщённый инвертированный индекс

GiST

Generalized Search Tree, Обобщённое дерево поиска

Git

Git

GMT

Greenwich Mean Time, Среднее время по Гринвичу

GSSAPI

Generic Security Services Application Programming Interface, Универсальный интерфейс программирования приложений служб безопасности

GUC

Grand Unified Configuration, Главная унифицированная конфигурация, подсистема PostgreSQL, управляющая конфигурацией сервера

HBA

Host-Based Authentication, Аутентификация по сетевым узлам

HOT

Кортежи только в куче

IEC

International Electrotechnical Commission, Международная электротехническая комиссия

IEEE

Institute of Electrical and Electronics Engineers, Институт инженеров по электротехнике и электронике

IPC

Inter-Process Communication, Межпроцессное взаимодействие

ISO

International Organization for Standardization, Международная организация по стандартизации

ISSN

International Standard Serial Number, Международный стандартный серийный номер

JDBC

Java Database Connectivity, Соединение с базами данных на Java

JIT

Just-in-Time compilation, JIT-компиляция

JSON

>JavaScript Object Notation, Представление объектов в JavaScript

LDAP

Lightweight Directory Access Protocol, Облегчённый протокол доступа к каталогам

LSN

Log Sequence Number, Последовательный номер в журнале; см. pg_lsn и Внутреннее устройство WAL.

MSVC

Microsoft Visual C

MVCC

Multi-Version Concurrency Control, Многоверсионное управление конкурентным доступом

NLS

National Language Support, Поддержка национальных языков

ODBC

Open Database Connectivity, Открытое соединение с базами данных

OID

Object Identifier, Идентификатор объекта

OLAP

Online Analytical Processing, Непосредственная аналитическая обработка

OLTP

Online Transaction Processing, Непосредственная транзакционная обработка

ORDBMS

Object-Relational Database Management System, Объектно-реляционная система управления базами данных

PAM

Pluggable Authentication Modules, Подключаемые модули аутентификации

PGSQL

PostgreSQL

PGXS

PostgreSQL Extension System, Система расширений PostgreSQL

PID

Process Identifier, Идентификатор процесса

PITR

Point-In-Time Recovery, Восстановление на момент времени (Непрерывное архивирование)

PL

Procedural Languages, Процедурные языки (на стороне сервера)

POSIX

Portable Operating System Interface, Переносимый интерфейс операционных систем

RDBMS

Relational Database Management System, Реляционная система управления базами данных

RFC

Request For Comments, Рабочее предложение

SGML

Standard Generalized Markup Language, Стандартный обобщённый язык разметки

SPI

Server Programming Interface, Интерфейс программирования сервера

SP-GiST

Space-Partitioned Generalized Search Tree, Обобщённое дерево поиска с секционированием пространства

SQL

Structured Query Language, Язык структурированных запросов

SRF

Set-Returning Function, Функция, возвращающая множество

SSH

Secure Shell, Защищённая оболочка

SSL

Secure Sockets Layer, Уровень защищённых сокетов

SSPI

Security Support Provider Interface, Интерфейс поставщика поддержки безопасности

SYSV

Unix System V

TCP/IP

Transmission Control Protocol (TCP) / Internet Protocol (IP), Протокол управления передачей/Межсетевой протокол

TID

Tuple Identifier, Идентификатор кортежа

TLS

Transport Layer Security, Протокол защиты транспортного уровня

TOAST

The Oversized-Attribute Storage Technique, Методика хранения сверхбольших атрибутов

TPC

Transaction Processing Performance Council, Совет по оценке производительности обработки транзакций

URL

Uniform Resource Locator, Универсальный указатель ресурса

UTC

Coordinated Universal Time, Универсальное координированное время

UTF

Unicode Transformation Format, Формат преобразования Unicode

UTF8

Eight-Bit Unicode Transformation Format, Восьмибитный формат преобразования Unicode

UUID

Universally Unique Identifier, Универсальный уникальный идентификатор

WAL

Write-Ahead Log, Журнал предзаписи

XID

Transaction Identifier, Идентификатор транзакции

XML

Extensible Markup Language, Расширяемый язык разметки


Библиография

Здесь представлены ссылки на справочные материалы и книги, посвящённые SQL и PostgreSQL.

Некоторые статьи и технические описания, написанные первой командой разработки POSTGRES, можно найти на сайте факультета компьютерных наук Калифорнийского университета в Беркли.

Справочники по языку SQL

[bowman01] The Practical SQL Handbook. Using SQL Variants. Fourth Edition. Judith Bowman, Sandra Emerson, Marcy Darnovsky. 0-201-70309-2. Addison-Wesley Professional. 2001.

[date97] A Guide to the SQL Standard. A user's guide to the standard database language SQL. Fourth Edition. C. J. Date Hugh Darwen. 0-201-96426-0. Addison-Wesley. 1997.

[date04] An Introduction to Database Systems. Eighth Edition. C. J. Date. 0-321-19784-4. Addison-Wesley. 2003.

[elma04] Fundamentals of Database Systems. Fourth Edition. Ramez Elmasri Shamkant Navathe. 0-321-12226-7. Addison-Wesley. 2003.

[melt93] Understanding the New SQL. A complete guide. Jim Melton Alan R. Simon. 1-55860-245-3. Morgan Kaufmann. 1993.

[ull88] Principles of Database and Knowledge-Base Systems. Classical Database Systems. Jeffrey D. Ullman. Volume 1. Computer Science Press. 1988.

[sqltr-19075-6] SQL Technical Report. Part 6: SQL support for JavaScript Object Notation (JSON). First Edition. 2017.

Документация, посвящённая PostgreSQL

[sim98] Enhancement of the ANSI SQL Implementation of PostgreSQL. Stefan Simkovics. Department of Information Systems, Vienna University of Technology. Vienna, Austria. November 29, 1998.

[yu95] The Postgres95. User Manual. A. Yu J. Chen. University of California. Berkeley, California. Sept. 5, 1995.

[fong] The design and implementation of the POSTGRES query optimizer. Zelaine Fong. University of California, Berkeley, Computer Science Department.

Заметки и статьи

[ports12] «Serializable Snapshot Isolation in PostgreSQL». D. Ports K. Grittner. VLDB Conference. August 2012. Istanbul, Turkey. .

[berenson95] «A Critique of ANSI SQL Isolation Levels». H. Berenson, P. Bernstein, J. Gray, J. Melton, E. O'Neil, P. O'Neil. ACM-SIGMOD Conference on Management of Data. June 1995. San Jose, California. .

[olson93] Partial indexing in POSTGRES: research project. Nels Olson. UCB Engin T7.49.1993 O676. University of California. Berkeley, California. 1993.

[ong90] «A Unified Framework for Version Modeling Using Production Rules in a Database System». L. Ong J. Goh. ERL Technical Memorandum M90/33. University of California. Berkeley, California. April, 1990.

[rowe87] «The POSTGRES data model». L. Rowe M. Stonebraker. VLDB Conference. Sept. 1987. Brighton, England. .

[seshadri95] «Generalized Partial Indexes». P. Seshadri A. Swami. Eleventh International Conference on Data Engineering. 6-10 March 1995. Taipeh, Taiwan. . Cat. No.95CH35724. IEEE Computer Society Press. Los Alamitos, California. 1995. 420-7.

[ston86] «The design of POSTGRES». M. Stonebraker L. Rowe. ACM-SIGMOD Conference on Management of Data. May 1986. Washington, DC. .

[ston87a] «The design of the POSTGRES rules system». M. Stonebraker, E. Hanson, C. H. Hong. IEEE Conference on Data Engineering. Feb. 1987. Los Angeles, California. .

[ston87b] «The design of the POSTGRES storage system». M. Stonebraker. VLDB Conference. Sept. 1987. Brighton, England. .

[ston89] «A commentary on the POSTGRES rules system». M. Stonebraker, M. Hearst, S. Potamianos. SIGMOD Record 18(3). Sept. 1989.

[ston89b] «The case for partial indexes». M. Stonebraker. SIGMOD Record 18(4). Dec. 1989. 4-11.

[ston90a] «The implementation of POSTGRES». M. Stonebraker, L. A. Rowe, M. Hirohama. Transactions on Knowledge and Data Engineering 2(1). IEEE. March 1990.

[ston90b] «On Rules, Procedures, Caching and Views in Database Systems». M. Stonebraker, A. Jhingran, J. Goh, S. Potamianos. ACM-SIGMOD Conference on Management of Data. June 1990. .