PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 13/10/2017 11:43:34

Comprendre le format pg_node_tree

Bonjour à tous,

J'ai besoin d'analyser la structure d'une valeur par défaut ou d'une contrainte de type check. Je récupère leurs définitions dans les tables du catalogue.

Par exemple, pour la table ayant l'OID 56233 dans ma base de test, je fais la requête suivante:

SELECT
    adrelid as table_oid,
    adnum as num_column,
    adsrc as content,
    adbin as nodes,
    pg_get_expr(adbin,56233,false)
FROM pg_attrdef
WHERE adrelid = 56233

Ce qui m'intéresse ici, c'est le contenu de la colonne adbin qui contient la représentation interne de la valeur par défaut.

{FUNCEXPR :funcid 480 :funcresulttype 23 :funcretset false :funcvariadic false :funcformat 2 :funccollid 0 :inputcollid 0 :args ({FUNCEXPR :funcid 1574 :funcresulttype 20 :funcretset false :funcvariadic false :funcformat 0 :funccollid 0 :inputcollid 0 :args ({CONST :consttype 2205 :consttypmod -1 :constcollid 0 :constlen 4 :constbyval true :constisnull false :location 141 :constvalue 4 [ -89 -37 0 0 0 0 0 0 ]}) :location 133}) :location -1}

Elle est représenté au format pg_node_tree pour lequel il est possible d'écrire un parseur.

Le problème, c'est que je ne trouve pas les spécifications de ce format. Je n'ai rien trouvé dans la doc ou sur le web. J'ai commencé à faire du reverse sur le contenu de la colonne adbin en faisant varier son contenu mais c'est un travail conséquent...

Quelqu'un aurait il un lien vers une documentation ou des connaissances sur pg_node_tree ?

Merci d'avance
Olivier smile

Hors ligne

#2 13/10/2017 12:41:42

Marc Cousin
Membre

Re : Comprendre le format pg_node_tree

Ça n'est effectivement pas documenté à l'extérieur du code. Le mieux pour commencer à creuser, à mon avis, ça serait de partir du code de pg_get_expr. Ou bien utiliser la fonction directement, vu qu'elle sert à convertir un adbin en contrainte SQL...


Marc.

Hors ligne

#3 13/10/2017 15:07:01

Re : Comprendre le format pg_node_tree

Utiliser la fonction pg_get_expr, c'est justement ce que je ne veux pas faire car elle retourne le code SQL exécuté et il me faudrait alors écrire un parseur SQL pour en extraire les informations qui m'intéresse (les entités SQL utilisées). D'ou l'idée de partir du pg_node_tree qui se rapproche d'un AST.

Olivier smile

Hors ligne

#4 13/10/2017 15:51:58

Marc Cousin
Membre

Re : Comprendre le format pg_node_tree

Oui. Donc le code de la fonction (et surtout de celles qu'elle appelle). Bon appétit smile


Marc.

Hors ligne

Pied de page des forums