PostgreSQLLa base de données la plus sophistiquée au monde.

Version anglaise

50.2. Routines callback des wrappers de données distantes

La fonction de gestion d'une FDW renvoie une structure FdwRoutine allouée avec palloc. Elle contient des pointeurs vers les fonctions de callback suivantes :

FdwPlan *
PlanForeignScan (Oid foreigntableid,
                 PlannerInfo *root,
                 RelOptInfo *baserel);

Planifie un parcours d'une table distante. Cette fonction est appelée lors de la planification d'une requête. foreigntableid est l'OID pg_class de la table distante. root sont des informations globales du planificateur sur la requête et baserel sont les informations du planificateur sur cette table. La fonction doit renvoyer une structure allouée par palloc, contenant les estimations de coût, ainsi que toute information privée du FDW, nécessaires à l'exécution du parcours plus tard. (Notez que les informations privées doivent être représentées sous une forme que copyObject sait copier.)

Les informations comprises dans root et baserel peuvent être utilisées pour réduire les informations à récupérer de la table distante (et du coup réduire l'estimation de coût). En particulier, baserel->baserestrictinfo est intéressant car il contient les qualificatifs de restriction (clauses WHERE) qui peuvent être utilisés pour filter les lignes à récupérer. (La FDW n'a pas besoin de forcer ces qualificatifs car le plan final les vérifiera de toute façon.) baserel->reltargetlist est utilisable pour déterminer les colonnes à récupérer.

En plus du renvoi des estimations de coûts, la fonction doit mettre à jour baserel->rows pour qu'elle corresponde au nombre de lignes que le FDW s'attend renvoyer lors du parcours, après avoir pris en compte le filtrage réalisé par les qualificatifs de restriction. La valeur initiale de baserel->rows est simplement une estimation constante par défaut, devant être remplacée si c'est possible. La fonction peut aussi choisir de mettre à jour baserel->width s'il peut calculer une meilleure estimation de la largeur moyenne d'une ligne de résultat.

void
ExplainForeignScan (ForeignScanState *node,
                    ExplainState *es);

Affiche une sortie EXPLAIN supplémentaire pour un parcours de table distante. Elle peut ne rien renvoyer si ce n'est pas nécessaire. Sinon, elle doit appeler ExplainPropertyText et les fonctions relatives pour ajouter des champs à la sortie du EXPLAIN. Les champs drapeaux dans es peuvent être utilisés pour déterminer ce qui doit être affiché et l'état du nœud ForeignScanState peut être inspecté pour fournir des statistiques à l'exécution dans le cas d'un EXPLAIN ANALYZE.

void
BeginForeignScan (ForeignScanState *node,
                  int eflags);

Commence l'exécution d'un parcours distant. L'appel se fait lors du démarrage de l'exécuteur. Cette fonction doit réaliser toutes les initialisation nécessaires avant le démarrage du parcours, mais ne doit pas commencer à exécuter le vrai parcours (cela se fera lors du premier appel à IterateForeignScan). Le nœud ForeignScanState est déjà créé mais son champ fdw_state vaut toujours NULL. Les informations sur la table à parcourir sont accessibles via le nœud ForeignScanState (en particulier à partir du nœud sous-jacent ForeignScan qui contient un pointeur vers la structure FdwPlan renvoyée par PlanForeignScan).

Notez que quand (eflags & EXEC_FLAG_EXPLAIN_ONLY) est vraie, cette fonction ne doit pas réaliser d'actions visibles en externe. Elle doit seulement faire le minimum requis pour que l'état du nœud soit valide pour ExplainForeignScan et EndForeignScan.

TupleTableSlot *
IterateForeignScan (ForeignScanState *node);

Récupère une ligne de la source distante, la renvoyant dans un emplacement de ligne de table (le champ ScanTupleSlot du nœud doit être utilisé dans ce but). Renvoie NULL s'il n'y a plus de lignes disponibles. L'infrastructure d'emplacement de ligne de table permet qu'une ligne physique ou virtuelle soit renvoyée. Dans la plupart des cas, la deuxième possibilité (virtuelle), est préférable d'un point de vue des performances. Notez que cette fonction est appelée dans un contexte mémoire dont la durée de vie est très courte et qui sera réinitialisé entre chaque appel. Créez un contexte mémoire dans BeginForeignScan si vous avez besoin d'un stockage qui tient plus longtemps ou utilisez le champ es_query_cxt de EState.

Les lignes renvoyées doivent correspondre à la signature de la colonne de la table distante parcourue. Si vous préférez optimiser la récupération des colonnes inutiles, vous devez insérer des NULL dans les positions de ces colonnes

Notez que l'exécuteur de PostgreSQL™ ne se préoccupe pas de savoir si les lignes renvoyées violent les contraintes NOT NULL définies sur les colonnes de la table distante. Le planificateur s'en préoccupe et pourrait mal optimiser les requêtes si des valeurs NULL sont présentes dans une colonne déclarée ne pas en contenir. Si une valeur NULL est découverte alors que l'utilisateur a déclaré qu'aucune valeur NULL ne devrait être présente, il pourrait être approprié de lever une erreur (exactement comme vous le feriez en cas d'un type de données inapproprié).

void
ReScanForeignScan (ForeignScanState *node);

Recommence le parcours depuis le début. Notez que les paramètres dont dépent le parcours peuvent avoir changés de valeur, donc le nouveau parcours ne va pas forcément renvoyer les mêmes lignes.

void
EndForeignScan (ForeignScanState *node);

Termine le parcours et relâche les ressources. Il n'est habituellement pas nécessaire de relâcher la mémoire allouée via palloc. Par contre, les fichiers ouverts et les connexions aux serveurs distants doivent être nettoyés.

Les types de structure FdwRoutine et FdwPlan sont déclarés dans src/include/foreign/fdwapi.h, qui est à lire pour des détails supplémentaires.