Documentation PostgreSQL 15.15 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs d'information sur le système

Précédent | Niveau supérieur | Suivant
9.25. Fonctions renvoyant des ensembles | Sommaire | 9.27. Fonctions d'administration système

## 9.26. Fonctions et opérateurs d'information sur le système

Tableau 9.66 montre différentes fonctions pour extraire des informations sur les sessions et le système.

En plus des fonctions listées dans cette section, il existe plusieurs fonctions relatives au système de statistiques qui fournissent aussi des informations sur le système. Voir Section 28.2.24 pour plus d'informations.

Tableau 9.66. Fonctions d'information sur la session

Fonction Description
`current_catalog` → `name` `current_database` () → `name` Renvoie le nom de la base actuelle. (Les bases sont appelées des « catalogues » dans le standard SQL, donc `current_catalog` est le terme du standard.)
`current_query` () → `text` Renvoie le texte de la requête en cours d'exécution telle qu'elle a été envoyée par le client (elle pourrait donc contenir plus d'une requête).
`current_role` → `name` Équivalent à `current_user`.
`current_schema` → `name` `current_schema` () → `name` Renvoie le nom du premier schéma dans le chemin de recherche (ou une valeur NULL si le chemin de recherche est vide). C'est le schéma qui sera utilisé par toute création de tables ou d'autres objets nommés si un schéma cible n'est pas précisé.
`current_schemas` ( `include_implicit` `boolean` ) → `name[]` Renvoie un tableau de noms pour tous les schémas présents dans le chemin de recherche, dans leur ordre de priorité. (Les éléments dans le paramètre search_path ne correspondant pas à des objets existants et cherchables sont omis.) Si l'argument booléen vaut `true`, alors les schémas systèmes implicites, tels que `pg_catalog` sont inclus dans le résultat.
`current_user` → `name` Renvoie le nom de l'utilisateur dans le contexte d'exécution actuel.
`inet_client_addr` () → `inet` Renvoie l'adresse IP du client actuel ou `NULL` si la connexion actuelle a été réalisée via une socket de domaine Unix.
`inet_client_port` () → `integer` Renvoie le numéro de port IP du client actuel, ou `NULL` si la connexion actuelle a été réalisée via une socket de domaine Unix.
`inet_server_addr` () → `inet` Renvoie l'adresse IP par laquelle le serveur a accepté la connexion actuelle, ou `NULL` si la connexion actuelle a été réalisée via une socket de domaine Unix.
`inet_server_port` () → `integer` Renvoie le numéro de port IP par lequel le serveur a accepté la connexion actuelle, ou `NULL` si la connexion actuelle a été réalisée via une socket de domaine Unix.
`pg_backend_pid` () → `integer` Renvoie l'identifiant de processus du processus serveur attaché à la session actuelle.
`pg_blocking_pids` ( `integer` ) → `integer[]` Renvoie un tableau d'identifiants de processus des sessions bloquant l'accès à un verrou pour le processus serveur dont l'identifiant a été donné. Renvoie un tableau vide si aucun processus ne le bloque. Un processus serveur bloque un autre processus s'il détient un verrou qui entre en conflit avec la demande de verrou du processus bloqué (blocage dur) ou s'il est en attente d'un verrou qui rentrerait en conflit avec la demande de verrou du processus bloqué et est devant lui dans la queue d'attente (verrou léger). Lors de l'utilisation de requêtes parallélisées, le résultat liste toujours les identifiants des processus visibles du client (autrement dit, le résultat de `pg_backend_pid`) même si le verrou réel est détenu ou attendu par un processus worker. Ceci résulte potentiellement en des PID dupliqués dans le résultat. De plus, notez que quand une transaction préparée détient un verrou en conflit, il sera représenté par un identifiant zéro. Les appels fréquents à cette fonction ont des impacts sur les performances de la base car il est nécessaire d'avoir un accès exclusif à l'état partagé du gestionnaire de verrous pour un court moment.
`pg_conf_load_time` () → `timestamp with time zone` Renvoie l'horodatage du dernier chargement des fichiers de configuration. Si la session actuelle était vivante à ce moment, cela sera l'heure quand la session a elle-même relu les fichiers de configuration (donc le résultat peut légèrement varier sur les différentes sessions). Sinon c'est le moment où le processus postmater relit les fichiers de configuration.
`pg_current_logfile` ( [ `text` ] ) → `text` Renvoie le chemin du fichier de traces actuellement utilisé par le collecteur de traces. Le chemin inclut le répertoire log_directory et le nom du fichier de traces individuel. Le résultat est `NULL` si le collecteur de traces est désactivé. Quand plusieurs fichiers de trace existent, chacun dans un format différent, `pg_current_logfile` sans argument renvoie le fichier vers le fichier ayant le premier format trouvé dans la liste ordonnée : `stderr`, `csvlog`, `jsonlog`. `NULL` est renvoyé si aucun fichier de trace n'a un de ces formats. Pour réclamer des informations sur un format spécifique de fichier de trace, indiquez soit `csvlog`, soit `jsonlog`, soit `stderr` comme valeur au paramètre optionnel. Le résultat est `NULL` si le format de trace demandé n'est pas configuré dans log_destination. Le résultat réflète le contenu du fichier `current_logfiles`.
`pg_my_temp_schema` () → `oid` Renvoie l'OID du schéma temporaire de la session en cours, ou zéro si ce schéma n'existe pas (parce que la session n'a pas créé de tables temporaires).
`pg_is_other_temp_schema` ( `oid` ) → `boolean` Renvoie true si l'OID donné est l'OID du schéma temporaire d'une autre session. (Ceci peut être utile, par exemple, pour exclure les tables temporaires des autres sessions d'un affichage du catalogue.)
`pg_jit_available` () → `boolean` Renvoie true si l'extension de compilation JIT est disponible (voir Chapitre 32) et si le paramètre de configuration jit est configuré à `on`.
`pg_listening_channels` () → `setof text` Renvoie l'ensemble de noms des canaux de notification asynchrone sur lesquels la session actuelle écoute.
`pg_notification_queue_usage` () → `double precision` Renvoie la fraction (0–1) de la taille maximale de la queue de notification asynchrone actuellement occupée par des notifications en attente de traitement. Voir LISTEN et NOTIFY pour plus d'informations.
`pg_postmaster_start_time` () → `timestamp with time zone` Renvoie l'heure de démarrage du serveur.
`pg_safe_snapshot_blocking_pids` ( `integer` ) → `integer[]` Renvoie un tableau d'identifiants de processus des sessions bloquant le processus serveur avec l'identifiant de processus spécifié pour acquérir une image propre. Renvoie un tableau vide si ce processus n'existe pas ou s'il n'est pas bloqué. Une session exécutant une transaction `SERIALIZABLE` bloque une transaction `SERIALIZABLE READ ONLY DEFERRABLE` sur l'acquisition d'une image jusqu'à ce que ce dernier détermine s'il est sûr d'éviter de prendre des verrous de prédicat. Voir Section 13.2.3 pour plus d'informations sur les transactions sérialisables et déferrables. Les appels fréquents à cette fonction pourraient avoir des impacts sur la performance des bases car elle a besoin d'accéder à l'état partagé du gestionnaire de verrous de prédicats pour un court moment.
`pg_trigger_depth` () → `integer` Renvoie le niveau de profondeur actuel des triggers PostgreSQL (0 si non appelé, directement ou indirectement, à partir d'un trigger).
`session_user` → `name` Renvoie le nom d'utilisateur de la session.
`user` → `name` Équivalent à `current_user`.
`version` () → `text` Renvoie une chaîne décrivant la version du serveur PostgreSQL. Vous pouvez aussi obtenir cette information à partir de server_version ou, pour une version lisible par un logiciel, vous pouvez utiliser server_version_num. Les développeurs de logiciels devraient utiliser `server_version_num` (disponible depuis la version 8.2) ou `PQserverVersion` au lieu d'analyser la version texte.

### Note

`current_catalog`, `current_role`, `current_schema`, `current_user`, `session_user` et `user` ont un statut syntaxique spécial en SQL : elles doivent être appelées sans les parenthèses. Dans PostgreSQL, les parenthèses peuvent être utilisées en option avec `current_schema`, mais pas avec les autres.

`session_user` est habituellement l'utilisateur qui a initié la connexion à la base de données ; les superutilisateurs peuvent modifier ce paramètre avec SET SESSION AUTHORIZATION. `current_user` est l'identifiant de l'utilisateur applicable pour les vérifications de droits. Habituellement, il est égal à l'utilisateur de la session mais il peut être changé avec SET ROLE. Il peut aussi changer durant l'exécution d'une fonction ayant l'attribut `SECURITY DEFINER`. Dans la parlance Unix, l'utilisateur de session est le « real user » et l'utilisateur courant est le « effective user ». `current_role` et `user` sont des synonymes pour `current_user`. (Le standard SQL fait une distinction entre `current_role` et `current_user`, mais PostgreSQL ne la fait pas car il unifie les utilisateurs et les rôles en une seule entité.)

Tableau 9.67 liste les fonctions qui permettent d'accéder programmatiquement aux droits d'accès aux objets. (Voir Section 5.7 pour plus d'informations sur les droits.) Dans ces fonctions, l'utilisateur dont les droits sont interrogés peut être indiqué par son nom ou son OID (`pg_authid`.`oid`), ou si le nom donné est `public`, alors la vérification se fait sur les droits du pseudo-rôle PUBLIC. De plus, l'argument `user` peut être complètement omis, auquel cas la vérification se fera sur `current_user`. L'objet vérifié peut être indiqué par son nom ou son OID. Dans le cas du nom, le nom du schéma peut être inclus si nécessaire. Le droit d'accès d'intérêt est indiqué par une chaîne de caractères qui doit correspondre à un des mots clés approprié pour le type d'objet (par exemple `SELECT`). En option, `WITH GRANT OPTION` peut être ajouté au type de droit pour tester si le droit contient cette option. De plus, plusieurs types de droits peuvent être listés en les séparant par des virgules, auquel cas le résultat sera vrai si un des droits est détenu (la casse n'est pas significative et les espaces blancs supplémentaires sont autorisés entre les noms des droits, mais pas à l'intérieur des noms.) Quelques exemples :

    SELECT has_table_privilege('myschema.mytable', 'select');
    SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');

Tableau 9.67. Fonctions d'accès aux droits

Fonction Description
`has_any_column_privilege` ( [ `user` `name` or `oid`, ] `table` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour une colonne de la table ? Ceci réussit si le droit est détenu pour la table entière ou s'il est détenu par au moins une colonne de la table. Les droits autorisés sont `SELECT`, `INSERT`, `UPDATE` et `REFERENCES`.
`has_column_privilege` ( [ `user` `name` or `oid`, ] `table` `text` or `oid`, `column` `text` or `smallint`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour la colonne spécifié de la table ? Ceci réussit si le droit est détenu pour la table entière ou s'il est détenu par cette colonne de la table. La colonne peut être spécifiée par son nom ou son numéro d'attribut (`pg_attribute`.`attnum`). Les droits autorisés sont `SELECT`, `INSERT`, `UPDATE` et `REFERENCES`.
`has_database_privilege` ( [ `user` `name` or `oid`, ] `database` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour la base ? Les droits autorisés sont `CREATE`, `CONNECT`, `TEMPORARY` et `TEMP` (qui est équivalent à `TEMPORARY`).
`has_foreign_data_wrapper_privilege` ( [ `user` `name` or `oid`, ] `fdw` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le foreign data wrapper ? Le seul droit autorisé est `USAGE`.
`has_function_privilege` ( [ `user` `name` or `oid`, ] `function` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour la fonction ? Le seul droit autorisé est `EXECUTE`. Lors de la spécification d'une fonction par nom, plutôt que par OID, l'entrée autorisée est la même que pour le type de données `regprocedure` (voir Section 8.19). En voici un exemple :
    SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
`has_language_privilege` ( [ `user` `name` or `oid`, ] `language` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le langage ? Le seul droit autorisé est `USAGE`.
`has_parameter_privilege` ( [ `user` `name` or `oid`, ] `parameter` `text`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour configurer ce paramètre ? Le nom du paramètre est insensible à la casse. Les droits autorisés sont `SET` et `ALTER SYSTEM`.
`has_schema_privilege` ( [ `user` `name` or `oid`, ] `schema` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le schéma ? Les droits autorisés sont `CREATE` et `USAGE`.
`has_sequence_privilege` ( [ `user` `name` or `oid`, ] `sequence` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour la séquence ? Les droits autorisés sont `USAGE`, `SELECT` et `UPDATE`.
`has_server_privilege` ( [ `user` `name` or `oid`, ] `server` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le serveur distant ? Le seul droit autorisé est `USAGE`.
`has_table_privilege` ( [ `user` `name` or `oid`, ] `table` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour la table ? Les droits autorisés sont `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `TRUNCATE`, `REFERENCES` et `TRIGGER`.
`has_tablespace_privilege` ( [ `user` `name` or `oid`, ] `tablespace` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le tablespace ? Le seul droit autorisé est `CREATE`.
`has_type_privilege` ( [ `user` `name` or `oid`, ] `type` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le type de données ? Le seul droit autorisé est `USAGE`. Lors de la spécification d'un type par son nom plutôt que par son OID, l'entrée autorisée est la même que pour le type de données `regtype` (voir Section 8.19).
`pg_has_role` ( [ `user` `name` or `oid`, ] `role` `text` or `oid`, `privilege` `text` ) → `boolean` Est-ce que l'utilisateur a le droit pour le rôle ? Les droits autorisés sont `MEMBER` et `USAGE`. `MEMBER` dénote une appartenance de groupe directe ou indirecte dans le rôle (autrement dit, le droit d'exécuter `SET ROLE`), alors que `USAGE` dénote si les droits de ce rôle sont immédiatement disponibles sans exécuter `SET ROLE`. `WITH ADMIN OPTION` ou `WITH GRANT OPTION` peuvent être ajoutés à un de ces types de droits si le droit `ADMIN` est détenu (les quatre syntaxes testent la même chose). Cette fonction n'autorise pas le cas spécial de configurer `user` à `public`, car le pseudo-rôle PUBLIC ne peut jamais être un membre d'un vrai rôle.
`row_security_active` ( `table` `text` or `oid` ) → `boolean` Est-ce que la sécurité niveau ligne est active pour la table dans le contexte de l'utilisateur et de l'environnement actuels ?

Tableau 9.68 montre les opérateurs disponibles pour le type `aclitem`, qui est la représentation catalogue pour les droits d'accès. Voir Section 5.7 pour des informations sur la lecture des droits d'accès.

Tableau 9.68. Opérateurs `aclitem`

Opérateur Description Exemple(s)
`aclitem` `=` `aclitem` → `boolean` Est-ce que les `aclitem` sont identiques ? (Notez que le type `aclitem` manque de l'ensemble habituel d'opérateurs de comparaison ; il n'a que l'égalité. Cependant, les tableaux `aclitem` peuvent seulement être comparés par égalité.) `'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem` → `f`
`aclitem[]` `@>` `aclitem` → `boolean` Est-ce que le tableau contient les droits indiqués ? (Ceci vaut true s'il existe une entrée de tableau qui correspond à l'`aclitem` et a au moins l'ensemble indiqué de droits.) `'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*/hobbes'::aclitem` → `t`
`aclitem[]` `~` `aclitem` → `boolean` Alias obsolète pour `@>`. `'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] ~ 'calvin=r*/hobbes'::aclitem` → `t`

Tableau 9.68 montre quelques fonctions supplémentaires pour la gestion du type `aclitem`.

Tableau 9.69. Fonctions `aclitem`

Fonction Description
`acldefault` ( `type` `"char"`, `ownerId` `oid` ) → `aclitem[]` Construit un tableau d'`aclitem` détenant les droits d'accès par défaut d'un objet de type `type` appartenant au rôle d'OID `ownerId`. Ceci représente les droits d'accès supposés quand une entrée ACL d'un objet est NULL. (Les droits d'accès par défaut sont décrits dans Section 5.7.) Le paramètre `type` doit faire partie de 'c' pour `COLUMN`, 'r' pour `TABLE` ainsi que les objets de type table, 's' pour `SEQUENCE`, 'd' pour `DATABASE`, 'f' pour `FUNCTION` ou `PROCEDURE`, 'l' pour `LANGUAGE`, 'L' pour `LARGE OBJECT`, 'n' pour `SCHEMA`, 'p' pour `PARAMETER`, 't' pour `TABLESPACE`, 'F' pour `FOREIGN DATA WRAPPER`, 'S' pour `FOREIGN SERVER`, ou 'T' pour `TYPE` ou `DOMAIN`.
`aclexplode` ( `aclitem[]` ) → `setof record` ( `grantor` `oid`, `grantee` `oid`, `privilege_type` `text`, `is_grantable` `boolean` ) Renvoie le tableau the `aclitem` sous la forme d'un ensemble de lignes. Si le bénéficiaire est le pseudo-rôle PUBLIC, il est représenté par zéro dans la colonne `grantee`. Chaque droit donné est représenté sous la forme `SELECT`, `INSERT`, etc. Notez que chaque droit est séparé sur sa propre ligne, donc un seul mot clé apparaît dans la colonne `privilege_type`.
`makeaclitem` ( `grantee` `oid`, `grantor` `oid`, `privileges` `text`, `is_grantable` `boolean` ) → `aclitem` Construit un `aclitem` avec les propriétés données.

Tableau 9.70 montre les fonctions qui déterminent si un certain objet est visible dans le chelub de recherche de schémas courant. Par exemple, une table est dite visible si le schéma qui la contient est dans le chemin de recherche. C'est équivalent au fait que la table doit être référencée par nom sans qualification explicite par d'un schéma. De ce fait, pour lister les noms des tables visibles :

    SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

Pour les fonctions et opérateurs, un objet dans le chemin de recherche est dit visible si aucun objet du même nom et du même type se trouve avant dans le chemin. Pour les classes et familles d'opérateur, le nom et la méthode d'accès associé de l'index sont considérés.

Tableau 9.70. Fonctions de vérification de la visibilité

Fonction Description
`pg_collation_is_visible` ( `collation` `oid` ) → `boolean` La collation est-elle visible dans le chemin de recherche ?
`pg_conversion_is_visible` ( `conversion` `oid` ) → `boolean` La conversion est-elle visible dans le chemin de recherche ?
`pg_function_is_visible` ( `function` `oid` ) → `boolean` La fonction est-elle visible dans le chemin de recherche ? (Ceci fonctionne aussi pour les procédures et les agrégats.)
`pg_opclass_is_visible` ( `opclass` `oid` ) → `boolean` La classe d'opérateurs est-elle visible dans le chemin de recherche ?
`pg_operator_is_visible` ( `operator` `oid` ) → `boolean` L'opérateur est-il visible dans le chemin de recherche ?
`pg_opfamily_is_visible` ( `opclass` `oid` ) → `boolean` La famille d'opérateur est-elle visible dans le chemin de recherche ?
`pg_statistics_obj_is_visible` ( `stat` `oid` ) → `boolean` L'objet statistique est-il visible dans le chemin de recherche ?
`pg_table_is_visible` ( `table` `oid` ) → `boolean` La table est-elle visible dans le chemin de recherche ? (Cela fonctionne aussi pour tous les types de relations, ceci incluant les vues, les vues matérialisées, les séquences et les tables externes.)
`pg_ts_config_is_visible` ( `config` `oid` ) → `boolean` La configuration de recherche plein texte est-elle visible dans le chemin de recherche ?
`pg_ts_dict_is_visible` ( `dict` `oid` ) → `boolean` Le dictionnaire de recherche plein texte est-il visible dans le chemin de recherche ?
`pg_ts_parser_is_visible` ( `parser` `oid` ) → `boolean` L'analyseur de recherche plein texte est-il visible dans le chemin de recherche ?
`pg_ts_template_is_visible` ( `template` `oid` ) → `boolean` Le modèle de recherche plein texte est-il visible dans le chemin de recherche ?
`pg_type_is_visible` ( `type` `oid` ) → `boolean` Le type (ou domaine) est-il visible dans le chemin de recherche ?

Toutes ces fonctions requièrent les OID des objets pour identifier l'objet à vérifier. Si vous voulez tester un objet par son nom, il est préférable d'utiliser les types d'alias de l'OID (`regclass`, `regtype`, `regprocedure`, `regoperator`, `regconfig` ou `regdictionary`), par exemple :

    SELECT pg_type_is_visible('myschema.widget'::regtype);

Notez qu'il n'y aurait pas de sens à tester un nom de type non qualifié par son schéma de cette façon -- si le nom peut être reconnu, c'est qu'il est visible.

Tableau 9.71 liste les fonctions qui extraient des informations des catalogues systèmes.

Tableau 9.71. Fonctions d'information sur les catalogues systèmes

Fonction Description
`format_type` ( `type` `oid`, `typemod` `integer` ) → `text` Renvoie le nom SQL pour un type de données identifié par l'OID type et potentiellement par un modifieur de type. Envoyez NULL pour le modifieur si aucun modifieur spécifique n'est connu.
`pg_char_to_encoding` ( `encoding` `name` ) → `integer` Convertit le nom d'encodage fourni en un entier représentant l'identifiant interne utilisé dans certains catalogues systèmes. Renvoie `-1` si le nom d'encodage fourni est inconnu.
`pg_encoding_to_char` ( `encoding` `integer` ) → `name` Convertit l'entier utilisé comme identifiant interne d'encodage pour certains catalogues systèmes en une chaîne lisible par un humain. Renvoie une chaîne vide si le numéro d'encodage fourni est invalide.
`pg_get_catalog_foreign_keys` () → `setof record` ( `fktable` `regclass`, `fkcols` `text[]`, `pktable` `regclass`, `pkcols` `text[]`, `is_array` `boolean`, `is_opt` `boolean` ) Retourne un ensemble de lignes décrivant les clés étrangères qui existent dans le catalogue système de PostgreSQL. La colonne `fktable` contient le nom du catalogue référent, et la colonne `fkcols` contient le(s) nom(s) de(s) colonne(s) référente(s). De même, la colonne `pktable` contient le nom du catalogue référencé, et la colonne `pkcols` contient le(s) nom(s) de(s) colonne(s) référencée(s). Si `is_array` vaut true, la dernière colonne référente est un tableau, dont chaque élément doit correspondre à une entrée du catalogue référencé. Si `is_opt` vaut true, la(les) colonne(s) référente(s) est(sont) autorisée(s) à contenir des zéros au lieu d'une référence valide.
`pg_get_constraintdef` ( `constraint` `oid` [, `pretty` `boolean` ] ) → `text` Reconstruit la commande de création pour une contrainte. (Ceci est une reconstruction décompilée, pas le texte original de la commande.)
`pg_get_expr` ( `expr` `pg_node_tree`, `relation` `oid` [, `pretty` `boolean` ] ) → `text` Décompile la forme interne de l'expression stockée dans les catalogues systèmes, telle que la valeur par défaut pour une colonne. Si l'expression peut contenir Vars, indiquez l'OID de la relation à laquelle elles font référence dans le deuxième paramètre ; si aucun Var n'est attendu, indiquer 0 est suffisant.
`pg_get_functiondef` ( `func` `oid` ) → `text` Reconstruit la commande de création pour une fonction ou une procédure. (C'est une reconstruction décompilée, pas le texte original de la commande.) Le résultat est une instruction complète, `CREATE OR REPLACE FUNCTION` ou `CREATE OR REPLACE PROCEDURE`.
`pg_get_function_arguments` ( `func` `oid` ) → `text` Reconstruit la liste d'argument d'une fonction ou procédure, dans la forme où elle devrait apparaître dans un `CREATE FUNCTION` (en incluant les valeurs par défaut).
`pg_get_function_identity_arguments` ( `func` `oid` ) → `text` Reconstruit la liste d'arguments nécessaire pour identifier une fonction ou une procédure, sous la forme nécessaire pour intégrer une commande telle que `ALTER FUNCTION`. Cette forme omet les valeurs par défaut.
`pg_get_function_result` ( `func` `oid` ) → `text` Reconstruit la clause `RETURNS` d'une function, dans la forme nécessaire pour apparaître dans `CREATE FUNCTION`. Renvoie `NULL` pour une procédure.
`pg_get_indexdef` ( `index` `oid` [, `column` `integer`, `pretty` `boolean` ] ) → `text` Reconstruit la commande de création pour un index (C'est une reconstruction décompilée, et non pas le texte original de la commande.) Si `column` est fourni et est différent de zéro, seule la définition de cette colonne est reconstruite.
`pg_get_keywords` () → `setof record` ( `word` `text`, `catcode` `"char"`, `barelabel` `boolean`, `catdesc` `text`, `baredesc` `text` ) Renvoie un ensemble d'enregistrements décrivant les mots clés SQL reconnus par le serveur. La colonne `word` contient le mot clé. La colonne `catcode` contient un code de catégorie : `U` pour un mot clé non réservé, `C` pour un mot clé qui peut être un nom de colonne, `T` pour un mot clé qui peut être un nom de type ou de fonction, `R` pour un mot totalement réservé. La colonne `barelabel` contient `true` si le mot clé peut être utilisé comme un nom de colonne strict dans les listes de `SELECT`, ou `false` si il ne peut être utilisé qu'après `AS`. La colonne `catdesc` contient une chaîne potentiellement localisée décrivant la catégorie du mot clé. La colonne `baredesc` contient une chaîne potentiellement localisée décrivant l'état de l'étiquette de la colonne du mot clé.
`pg_get_ruledef` ( `rule` `oid` [, `pretty` `boolean` ] ) → `text` Reconstruit la commande de création pour une règle. (C'est une reconstruction décompilée, et non pas le texte original de la commande.)
`pg_get_serial_sequence` ( `table` `text`, `column` `text` ) → `text` Renvoie le nom de la séquence associée à une colonne ou NULL si aucune séquence n'est associée à la colonne. Si la colonne est une colonne identité, la séquence associée est la séquence créée en interne pour cette colonne. Pour les colonnes créées en utilisant un des types serial (`serial`, `smallserial`, `bigserial`), il s'agit de la séquence crée pour la définition de la colonne serial. Dans ce dernier cas, l'association peut être modifiée ou supprimée avec `ALTER SEQUENCE OWNED BY`. (Cette fonction aurait due s'appeler `pg_get_owned_sequence` ; son nom actuel reflète le fait qu'elle était historiquement utilisée avec des colonnes serial.) Le premier paramètre est un nom de tableau avec le schéma en option, et le deuxième paramètre est un nom de colonne. Comme le premier paramètre contient potentiellement un nom de schéma et un nom de table, il est analysé suivant les règles SQL habituelles, signifiant qu'il est mis en minuscule par défaut. Le second paramètre, étant juste un nom de colonne, est traité littéralement et conserve donc sa casse. Le résultat est formaté de façon convenable pour être donné à des fonctions de séquence (voir Section 9.17). Une utilisation typique est la lecture de la valeur actuelle d'une séquence pour une colonne identité ou serial. Par exemple :
    SELECT currval(pg_get_serial_sequence('sometable', 'id'));
`pg_get_statisticsobjdef` ( `statobj` `oid` ) → `text` Reconstruit le commande de création d'un objet statistique étendu. (Ceci est une reconstruction décompilée, par le texte de la commande originale.)
`pg_get_triggerdef` ( `trigger` `oid` [, `pretty` `boolean` ] ) → `text` Reconstruit la commande de création d'un trigger. (Ceci est une reconstruction décompilée, par le texte de la commande originale.)
`pg_get_userbyid` ( `role` `oid` ) → `name` Renvoie le nom d'un rôle d'après son OID.
`pg_get_viewdef` ( `view` `oid` [, `pretty` `boolean` ] ) → `text` Reconstruit la commande `SELECT` sous-jacente pour une vue ou une vue matérialisée. (Ceci est une reconstruction décompilée, par le texte de la commande originale.)
`pg_get_viewdef` ( `view` `oid`, `wrap_column` `integer` ) → `text` Reconstruit la commande `SELECT` sous-jacente pour une vue ou une vue matérialisée. (Ceci est une reconstruction décompilée, par le texte de la commande originale.) Dans cette forme de la fonction, l'affichage joli est toujours activé, et les longues lignes sont coupées pour essayer de les conserver plus petites que le nombre indiqué de colonnes.
`pg_get_viewdef` ( `view` `text` [, `pretty` `boolean` ] ) → `text` Reconstruit la commande `SELECT` sous-jacente pour une vue ou une vue matérialisée, en travaillant à partir d'un nom pour la vue plutôt que de son OID. (Ceci est obsolète ; utilisez la variante OID à la place.)
`pg_index_column_has_property` ( `index` `regclass`, `column` `integer`, `property` `text` ) → `boolean` Teste si une colonne d'index a la propriété nommée. Les propriétés communes de colonne d'index sont listées dans Tableau 9.72. (Notez que les méthodes d'accès d'extension peuvent définir des noms de propriété supplémentaires pour leurs index.) `NULL` est renvoyé si le nom de la propriété n'est pas connu ou ne s'applique pas à l'objet particulier ou si l'OID ou le numéro de colonne n'identifie pas un objet valide.
`pg_index_has_property` ( `index` `regclass`, `property` `text` ) → `boolean` Teste si un index a la propriété nommée. Les propriétés communes d'index sont listées dans Tableau 9.73. (Notez que les méthodes d'accès d'extension peuvent définir des noms de propriété supplémentaires pour leurs index.) `NULL` est renvoyé si le nom de la propriété n'est pas connu ou ne s'applique pas à l'objet particulier ou si l'OID n'identifie pas un objet valide.
`pg_indexam_has_property` ( `am` `oid`, `property` `text` ) → `boolean` Teste si une méthode d'accès aux index a la propriété nommée. Les propriétés communes des méthodes d'accès aux index sont listées dans Tableau 9.74. `NULL` est renvoyé si le nom de la propriété n'est pas connu ou ne s'applique pas à l'objet particulier ou si l'OID n'identifie pas un objet valide.
`pg_options_to_table` ( `options_array` `text[]` ) → `setof record` ( `option_name` `text`, `option_value` `text` ) Renvoie l'ensemble d'options de stockage représenté par une valeur à partir de `pg_class`.`reloptions` ou `pg_attribute`.`attoptions`.
`pg_settings_get_flags` ( `guc` `text` ) → `text[]` Renvoie un tableau de drapeaux associés avec le paramètre donné ou `NULL` s'il n'existe pas. Le résultat est un tableau vide si le paramètre existe mais qu'aucun drapeau n'existe pour lui. Seuls les drapeaux les plus utiles listés dans Tableau 9.75 sont exposés.
`pg_tablespace_databases` ( `tablespace` `oid` ) → `setof oid` Renvoie l'ensemble d'OID des bases ayant des objets dans le tablespace indiqué. Si cette fonction renvoie des lignes, le tablespace n'est pas vide et ne peut pas être supprimé. Pour identifier les objets spécifiques peuplant le tablespace, vous aurez besoin de vous connecter aux bases identifiées par `pg_tablespace_databases` et de requêter leurs catalogues `pg_class`.
`pg_tablespace_location` ( `tablespace` `oid` ) → `text` Renvoie le chemin du système de fichiers où ce tablespace est situé.
`pg_typeof` ( `"any"` ) → `regtype` Renvoie l'OID du type de données de la valeur qui lui est fournie. Ceci peut être utile pour débogguer ou pour construire dynamiquement des requêtes SQL. Cette fonction est déclarée renvoyer le type `regtype`, qui est un alias d'OID pour les objets types de données (voir Section 8.19) ; ceci signifie qu'il est identique à un OID pour des comparaisons mais qu'il s'affiche sous la forme du nom du type. Par exemple :
    SELECT pg_typeof(33);
     pg_typeof
    -----------
     integer

    SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
     typlen
    --------
          4
`COLLATION FOR` ( `"any"` ) → `text` Renvoie le nom de la collation de la valeur qui lui est fournie. La valeur est entre guillemet et qualifiée du schéma si nécessaire. Si aucune collation n'a été dérivée de l'expression de l'argument, alors `NULL` est renvoyée. Si l'argument n'est pas un type de données collationnable, alors une erreur est levée. Par exemple :
    SELECT collation for (description) FROM pg_description LIMIT 1;
     pg_collation_for
    ------------------
     "default"

    SELECT collation for ('foo' COLLATE "de_DE");
     pg_collation_for
    ------------------
     "de_DE"
`to_regclass` ( `text` ) → `regclass` Traduit un nom de relation en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regclass` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regcollation` ( `text` ) → `regcollation` Traduit un nom de collation en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regcollation` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regnamespace` ( `text` ) → `regnamespace` Traduit un nom de schéma en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regnamespace` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regoper` ( `text` ) → `regoper` Traduit un nom d'opérateur en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regoper` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regoperator` ( `text` ) → `regoperator` Traduit un nom d'opérateur en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regoperator` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regproc` ( `text` ) → `regproc` Traduit un nom de fonction ou procédure en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regproc` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regprocedure` ( `text` ) → `regprocedure` Traduit un nom de fonction ou procédure en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regprocedure` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regrole` ( `text` ) → `regrole` Traduit un nom de rôle en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regrole` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.
`to_regtype` ( `text` ) → `regtype` Traduit un nom de type en son OID. Un résultat similaire est obtenu en convertissant la chaîne dans le type `regtype` (voir Section 8.19) ; néanmoins, cette fonction renverra `NULL` plutôt que de lever une erreur si le nom n'est pas trouvé. De plus, contrairement à la conversion, ceci n'accepte pas un OID numérique en entrée.

La plupart des fonctions qui reconstruisent (décompilent) des objets de base ont un drapeau `pretty`, qui à `true`, cause que le résultat soit « joliment affiché ». Un bel affichage supprime les parenthèses inutiles et ajoute des espaces blancs pour la lisibilité. Ce format est plus lisible mais le format par défaut a plus de chance d'être interprété de la même façon par les versions futures de PostgreSQL ; pour éviter d'utiliser une sortie joliment affichée pour les sauvegardes. Configurer `false` pour le paramètre `pretty` donne le même résultat que d'omettre le paramètre.

Tableau 9.72. Propriétés des colonnes d'un index

Nom | Description
--- | ---
`asc` | Est-ce que la colonne trie en ordre ascendant sur un parcours en avant ?
`desc` | Est-ce que la colonne trie en ordre descendant sur un parcours en avant ?
`nulls_first` | Est-ce que la colonne trie les valeurs NULL en premier sur un parcours en avant ?
`nulls_last` | Est-ce que la colonne trie les valeurs NULL en dernier sur un parcours en avant ?
`orderable` | Est-ce que la colonne possède un ordre de tri défini ?
`distance_orderable` | Est-ce que la colonne peut être parcourue en ordre par un opérateur « distance », par exemple `ORDER BY col <-> constant` ?
`returnable` | Est-ce que la valeur de la colonne peut être renvoyée par un parcours d'index seul ?
`search_array` | Est-ce que la colonne supporte nativement les recherches `col = ANY(array)` ?
`search_nulls` | Est-ce que la colonne supporte les recherches `IS NULL` et `IS NOT NULL` ?

Tableau 9.73. Propriétés des index

Nom | Description
--- | ---
`clusterable` | L'index peut-il être utilisé dans une commande `CLUSTER` ?
`index_scan` | L'index supporte-t-il les parcours simples (non bitmap) ?
`bitmap_scan` | L'index supporte-t-il les parcours bitmap ?
`backward_scan` | Est-ce que la direction du parcours peut être changée en milieu de parcours (pour accepter `FETCH BACKWARD` sur un curseur sans nécessiter de matérialisation) ?

Tableau 9.74. Propriétés des méthodes d'accès aux index

Nom | Description
--- | ---
`can_order` | Est-ce que la méthode d'accès supporte `ASC`, `DESC` et les autres mots-clés dans `CREATE INDEX` ?
`can_unique` | Est-ce que la méthode d'accès supporte les index d'unicité ?
`can_multi_col` | Est-ce que la méthode d'accès supporte les index multi-colonnes ?
`can_exclude` | Est-ce que la méthode d'accès supporte les contraintes d'exclusion ?
`can_include` | Est-ce que la méthode d'accès supporte la clause `INCLUDE` de `CREATE INDEX` ?

Tableau 9.75. Drapeaux des GUC

Drapeau | Description
--- | ---
`EXPLAIN` | Les paramètres disposant de ce drapeau sont inclus dans les commandes `EXPLAIN (SETTINGS)`.
`NO_SHOW_ALL` | Les paramètres disposant de ce drapeau sont exclus des commandes `SHOW ALL`.
`NO_RESET_ALL` | Les paramètres disposant de ce drapeau sont exclus des commandes `RESET ALL`.
`NOT_IN_SAMPLE` | Les paramètres disposant de ce drapeau ne sont pas inclus par défaut dans `postgresql.conf`.
`RUNTIME_COMPUTED` | Les paramètres disposant de ce drapeau sont calculés à l'exécution.

Tableau 9.76 liste les fonctions relatives à l'identification et l'adressage des objets de la base.

Tableau 9.76. Fonctions d'information et d'adressage des objets

Fonction Description
`pg_describe_object` ( `classid` `oid`, `objid` `oid`, `objsubid` `integer` ) → `text` Renvoie une description textuelle d'un objet de base identifié par un OID de catalogue, un OID d'objet, et un identifiant de sous-objet (tel que le numéro de colonne dans une table ; cet identifiant vaut zéro lorsqu'il référence un objet complet). Cette description a pour but d'être lisible par un humain, et pourrait être traduite, suivant la configuration du serveur. C'est particulièrement utile pour déterminer l'identité d'un objet référencé dans le catalogue `pg_depend`. Cette fontion retourne des valeurs `NULL` pour les objets non définis.
`pg_identify_object` ( `classid` `oid`, `objid` `oid`, `objsubid` `integer` ) → `record` ( `type` `text`, `schema` `text`, `name` `text`, `identity` `text` ) Renvoie une ligne contenant suffisamment d'informations pour identifier de façon unique l'objet de la base spécifié par un OID de catalogue, un OID d'objet et un identifiant de sous-objet. Cette information a pour but d'être lisible par un logiciel et n'est jamais traduite. `type` identifie le type d'objet de base ; `schema` est le nom du schéma auquel l'objet appartient ou `NULL` pour les types d'objet n'appartenant pas à des schémas ; `name` est le nom de l'objet, entre guillemets si nécessaire, si le nom (avec le nom du schéma le cas échéant) est suffisant pour identifier de façon unique l'objet, et `NULL` sinon ; `identity` est l'identité complète de l'objet, avec le format précis dépendant du type d'objet, et chaque nom dans le format habituel (qualification avec le schéma et guillemets doubles si nécessaire). Les objets non définis sont identifiés par des valeurs `NULL`.
`pg_identify_object_as_address` ( `classid` `oid`, `objid` `oid`, `objsubid` `integer` ) → `record` ( `type` `text`, `object_names` `text[]`, `object_args` `text[]` ) Renvoie une ligne contenant suffisamment d'informations pour identifier de façon unique l'objet de la base spécifié par un OID de catalogue, un OID d'objet et un identifiant de sous-objet. L'information renvoyé est indépendante du serveur, autrement dit il pourrait être utilisé pour idenfier un objet pareillement nommé sur un autre serveur. `type` identifie le type d'objet de base ; `object_names` et `object_args` sont des tableaux de texte qui forment ensemble une référence à l'objet. Ces trois valeurs peuvent être passées à `pg_get_object_address` pour obtenir l'adresse interne de l'objet.
`pg_get_object_address` ( `type` `text`, `object_names` `text[]`, `object_args` `text[]` ) → `record` ( `classid` `oid`, `objid` `oid`, `objsubid` `integer` ) Renvoie une ligne contenant suffisamment d'informations pour identifier de façon unique l'objet de base spécifié par le code type et le nom d'objet et les tableaux d'arguments. Les valeurs renvoyées sont celles qui seraient utilisées dans les catalogues systèmes tels que `pg_depend` ; elles peuvent être fournies à d'autres fonctions systèmes telles que `pg_describe_object` ou `pg_identify_object`. `classid` est l'OID du catalogue système contenant l'objet ; `objid` est l'OID de l'objet lui-même et `objsubid` est l'identifiant du sous-objet ou 0 si aucun. Cette fonction est l'inverse de `pg_identify_object_as_address`. Les objets non définis sont identifiés par des valeurs `NULL`.

Les fonctions listées dans Tableau 9.77 extraient les commentaires préalablement enregistrés avec la commande COMMENT. Une valeur NULL est renvoyée si aucun commentaire n'a été trouvé pour les paramètres donnés.

Tableau 9.77. Fonctions d'informations sur les commentaires

Fonction Description
`col_description` ( `table` `oid`, `column` `integer` ) → `text` Renvoie le commentaire pour une colonne de table, qui est spécifié par l'OID de la table et le numéro de colonne. (`obj_description` ne peut être utilisé pour les colonnes d'une table car les colonnes n'ont pas d'OID propre.)
`obj_description` ( `object` `oid`, `catalog` `name` ) → `text` Renvoie le commentaire pour un objet de la base qui est spécifié par son OID et le nom du catalogue système le contenant. Par exemple, `obj_description(123456, 'pg_class')` récupérera le commentaire de la table d'OID 123456.
`obj_description` ( `object` `oid` ) → `text` Renvoie le commentaire pour un objet de la base spécifié par son seul OID. Cette fonction est obsolète cat il n'existe aucune garantie que les OID soient uniques entre différents catalogues systèmes ; de ce fait, un mauvais commentaire pourrait être renvoyé.
`shobj_description` ( `object` `oid`, `catalog` `name` ) → `text` Renvoie le commentaire pour un objet de base partagé, spécifié par son OID et le nom du catalogue système le contenant. C'est comme `obj_description`, sauf que c'est utilisé pour récupérer les commentaires sur les objets partagés (donc les bases, les rôles et les tablespaces). Certains catalogues systèmes sont globaux à toutes les bases d'une instance, et les descriptions de ces objects sont stockées là-aussi globalement.

Les fonctions listées dans Tableau 9.78 fournissent des informations sur la transaction serveur dans un format exportable. L'utilisation principale de ces fonctions est de déterminer les transactions validées entre deux images de base.

Tableau 9.78. Fonctions d'identifiants de transaction et d'informations sur les images de base

Fonction Description
`pg_current_xact_id` () → `xid8` Renvoie l'identifiant actuel de la transaction. Il sera affecté si la transaction n'en a pas déjà un (ceci arrive si elle n'a pas encore réalisé d'écritures sur la base).
`pg_current_xact_id_if_assigned` () → `xid8` Renvoie l'identifiant actuel de la transaction ou `NULL` si aucun identifiant n'a encore été assigné. (Il est préférable d'utiliser cette variante si la transaction est habituellement en lecture seule pour éviter de consommer inutilement un identifiant de transaction.)
`pg_xact_status` ( `xid8` ) → `text` Renvoie le statut de validation d'une transaction récente. Le résultat fait partie de `in progress`, `committed` ou `aborted`, en supposant que la transaction est suffisamment récente pour que le système dispose du statut de validation de cette transaction. S'il est assez ancien pour qu'aucune référence de la transaction n'est survécu au système et que le statut de validation ait disparu, le résultat est `NULL`. Les applications peuvent utiliser cette fonction pour déterminer, par exemple, si leur transaction a été validée ou annulée si l'application a été déconnectée alors qu'un `COMMIT` était en cours. Notez que les transactions préparées sont rapportés `en cours` ; les applications doivent vérifier `pg_prepared_xacts` si elles ont besoin de savoir si un identifiant de transaction appartient à une transaction préparée.
`pg_current_snapshot` () → `pg_snapshot` Renvoie un snapshot (image) actuel, une structure de données indiquant les identifiants de transaction actuellement en cours.
`pg_snapshot_xip` ( `pg_snapshot` ) → `setof xid8` Renvoie l'ensemble des identifiants de transactions en cours contenu dans un snapshot (image de base).
`pg_snapshot_xmax` ( `pg_snapshot` ) → `xid8` Renvoie le `xmax` d'une image de base.
`pg_snapshot_xmin` ( `pg_snapshot` ) → `xid8` Renvoie le `xmin` d'une image de base
`pg_visible_in_snapshot` ( `xid8`, `pg_snapshot` ) → `boolean` Est-ce que l'identifiant de transaction donné est visible d'après cette image de base (autrement dit, est-il terminé avant que l'image ne soit réalisée) ? Notez que cette fonction ne renverra pas la bonne réponse pour un identifiant de sous-transaction.
`pg_get_multixact_members` ( `multixid` `xid` ) → `setof record` ( `xid` `xid`, `mode` `text` ) Renvoie l'identifiant de transaction et le mode de verrou pour chaque membre de l'identifiant MultiXact indiqué. Les modes de verrou `forupd`, `fornokeyupd`, `sh` et `keysh` correspondent, respectivement, aux verrous niveau ligne de `FOR UPDATE`, `FOR NO KEY UPDATE`, `FOR SHARE` et `FOR KEY SHARE`, comme décrit dans Section 13.3.2. Deux modes supplémentaires sont spécifiques aux MultiXact : `nokeyupd`, utilisé par les mises à jour qui ne modifient pas de colonnes clés, et `upd`, utilisé par les mises à jour des colonnes clés.

Le type interne des identifiants de transaction, `xid`, est sur 32 bits et boucle tous les 4 milliards de transactions. Néanmoins, les fonctions listées dans Tableau 9.78, sauf `age`, `mxid_age` et `pg_get_multixact_members`, utilisent un type `xid8` sur 64 bits qui ne boucle pas sur toute la durée de vie d'une instance, et qui peut être converti en `xid` par conversion si nécessaire. Le type de données `pg_snapshot` enregistre des informations sur la visibilité des identifiants de transaction à un moment particulier. Ses composants sont décrits dans Tableau 9.79. La représentation textuelle de `pg_snapshot` est ``xmin`:`xmax`:`xip_list``. Par exemple, `10:20:10,14,15` signifie `xmin=10, xmax=20, xip_list=10, 14, 15`.

Tableau 9.79. Composants d'image de base

Nom | Description
--- | ---
`xmin` | Plus petit identifiant de transaction toujours actif. Tous les identifiants de transaction inférieurs à `xmin` sont soit validés et visibles, soit annulés et morts.
`xmax` | L'identifiant de transaction après le dernier identifiant terminé. Tous les identifiants de transaction supérieurs ou égals à `xmax` ne sont pas encore terminés au moment de la création de l'image, et sont de ce fait invisibles.
`xip_list` | Transactions en cours au moment de la création de l'image de base. Un identifiant de transaction qui est `xmin <= `X` < xmax` et qui n'est pas dans cette liste a déjà été terminé au moins de la création de l'image et, de ce fait, est soit visible soit mort suivant son statut de validation. Cette liste n'inclut pas les identifiants de transaction des sous-transactions.

Dans les versions de PostgreSQL antérieures à la 13, le type `xid8` n'existait pas, donc des variantes de ces fonctions étaient fournies. Elles utilisaient le type `bigint` pour représenter un identifiant sur 64 bits, avec un type de données pour l'image nommé `txid_snapshot`. Ces anciennes fonctions avaient le mot `txid` dans leur nom. Elles sont toujours acceptées pour des raisons de compatibilité ascendante, mais pourraient être supprimées dans une version future. Voir Tableau 9.80.

Tableau 9.80. Fonctions obsolètes sur les identifiants de transactions et les informations sur les images de base

Fonction Description
`txid_current` () → `bigint` Voir `pg_current_xact_id()`.
`txid_current_if_assigned` () → `bigint` Voir `pg_current_xact_id_if_assigned()`.
`txid_current_snapshot` () → `txid_snapshot` Voir `pg_current_snapshot()`.
`txid_snapshot_xip` ( `txid_snapshot` ) → `setof bigint` Voir `pg_snapshot_xip()`.
`txid_snapshot_xmax` ( `txid_snapshot` ) → `bigint` Voir `pg_snapshot_xmax()`.
`txid_snapshot_xmin` ( `txid_snapshot` ) → `bigint` Voir `pg_snapshot_xmin()`.
`txid_visible_in_snapshot` ( `bigint`, `txid_snapshot` ) → `boolean` Voir `pg_visible_in_snapshot()`.
`txid_status` ( `bigint` ) → `text` Voir `pg_xact_status()`.

Les fonctions montrées dans Tableau 9.81 fournissent des informations sur le moment où d'anciennes transactions ont été validées. Elles fournissent des informations utiles seulement quand le paramètre track_commit_timestamp est activé, et seulement pour les transactions qui ont été validées après l'activation du paramètre.

Tableau 9.81. Fonctions d'informations sur les transactions validées

Fonction Description
`pg_xact_commit_timestamp` ( `xid` ) → `timestamp with time zone` Renvoie l'horodatage de validation d'une transaction.
`pg_xact_commit_timestamp_origin` ( `xid` ) → `record` ( `timestamp` `timestamp with time zone`, `roident` `oid`) Retourne l'horodatage de validation et l'origine de réplication d'une transaction.
`pg_last_committed_xact` () → `record` ( `xid` `xid`, `timestamp` `timestamp with time zone`, `roident` `oid` ) Renvoie l'identifiant de transaction, l'horodatage de sa validation et l'origine de la réplication pour la dernière transaction validée.

Les fonctions listées dans Tableau 9.82 affichent des informations initialisées lors de l'exécution de la commande `initdb`, telle que la version du catalogue. Elles affichent aussi des informations sur les écritures dans les journaux de transactions et le traitement des checkpoints. Ces informations sont globales à l'instance, et non pas spécifique à une base. Ces fonctions fournissent la plupart des informations en utilisant la mêle source que l'application pg_controldata.

Tableau 9.82. Fonctions des données de contrôle

Fonction Description
`pg_control_checkpoint` () → `record` Renvoie des informations sur l'état du checkpoint en cours, comme indiqué dans Tableau 9.83.
`pg_control_system` () → `record` Renvoie des informations sur l'état du fichier de contrôle en cours, comme indiqué dans Tableau 9.84.
`pg_control_init` () → `record` Renvoie des informations sur l'état d'initialisation de l'instance, comme indiqué dans Tableau 9.85.
`pg_control_recovery` () → `record` Renvoie des informations sur l'état de restauration, comme indiqué dans Tableau 9.86.

Tableau 9.83. Colonnes en sortie de `pg_control_checkpoint`

Nom de la colonne | Type de données
--- | ---
`checkpoint_lsn` | `pg_lsn`
`redo_lsn` | `pg_lsn`
`redo_wal_file` | `text`
`timeline_id` | `integer`
`prev_timeline_id` | `integer`
`full_page_writes` | `boolean`
`next_xid` | `text`
`next_oid` | `oid`
`next_multixact_id` | `xid`
`next_multi_offset` | `xid`
`oldest_xid` | `xid`
`oldest_xid_dbid` | `oid`
`oldest_active_xid` | `xid`
`oldest_multi_xid` | `xid`
`oldest_multi_dbid` | `oid`
`oldest_commit_ts_xid` | `xid`
`newest_commit_ts_xid` | `xid`
`checkpoint_time` | `timestamp with time zone`

Tableau 9.84. Colonnes en sortie de `pg_control_system`

Nom de colonne | Type de données
--- | ---
`pg_control_version` | `integer`
`catalog_version_no` | `integer`
`system_identifier` | `bigint`
`pg_control_last_modified` | `timestamp with time zone`

Tableau 9.85. Colonnes en sortie de `pg_control_init`

Nom de colonne | Type de données
--- | ---
`max_data_alignment` | `integer`
`database_block_size` | `integer`
`blocks_per_segment` | `integer`
`wal_block_size` | `integer`
`bytes_per_wal_segment` | `integer`
`max_identifier_length` | `integer`
`max_index_columns` | `integer`
`max_toast_chunk_size` | `integer`
`large_object_chunk_size` | `integer`
`float8_pass_by_value` | `boolean`
`data_page_checksum_version` | `integer`

Tableau 9.86. Colonnes en sortie de `pg_control_recovery`

Nom de colonne | Type de données
--- | ---
`min_recovery_end_lsn` | `pg_lsn`
`min_recovery_end_timeline` | `integer`
`backup_start_lsn` | `pg_lsn`
`backup_end_lsn` | `pg_lsn`
`end_of_backup_record_required` | `boolean`