Lorsqu'un CustomScan
est
exécuté, l'état de son exécution est représenté par un
CustomScanState
, qui est déclaré comme
suit :
typedef struct CustomScanState { ScanState ss; uint32 flags; const CustomExecMethods *methods; } CustomScanState;
ss
est initialisé comme
tous les autres états de parcours, sauf que si le
parcours est pour une jointure plutôt qu'une relation,
ss.ss_currentRelation
est laissé à
NULL. flags
est un masque de bits avec la
même signification que dans CustomPath
et
CustomScan
. methods
doit pointer vers un objet (généralement alloué statiquement)
implémentant les méthodes requises d'un état de parcours
personnalisé, qui sont détaillées ci-dessous. Typiquement, une
structure CustomScanState
, qui n'a pas
besoin de supporter la fonction copyObject
,
sera actuellement une structure plus grande incorporant la structure
ci-dessus comme premier membre.
void (*BeginCustomScan) (CustomScanState *node, EState *estate, int eflags);
Complète l'initialisation de la structure
CustomScanState
. Les champs standards ont été
initialisés par la fonction ExecInitCustomScan
,
mais tous les champs privés devraient être initialisés ici.
TupleTableSlot *(*ExecCustomScan) (CustomScanState *node);
Récupère la ligne suivante du parcours. Si il
existe des lignes restantes, la fonction devrait remplir
pg_ResultTupleSlot
avec la ligne suivante dans
le sens actuel du parcours, puis renvoyer le slot de la ligne. Dans
le cas contraire, NULL
ou un slot vide devrait
être renvoyé.
void (*EndCustomScan) (CustomScanState *node);
Nettoie les données privées associées avec le
CustomScanState
. Cette méthode est obligatoire,
mais elle n'a pas besoin de faire quoi que ce soit si il n'y a
pas de données associées ou des données qui seront nettoyées
automatiquement.
void (*ReScanCustomScan) (CustomScanState *node);
Repositionne au début le parcours en cours et prépare à parcourir de nouveau la relation.
void (*MarkPosCustomScan) (CustomScanState *node);
Enregistre la position du parcours courant de telle manière
qu'elle puisse être restaurée par la fonction callback
RestrPosCustomScan
. Cette fonction callback
est facultative, et n'a besoin d'être fournie que si le drapeau
CUSTOMPATH_SUPPORT_MARK_RESTORE
est positionné.
void (*RestrPosCustomScan) (CustomScanState *node);
Restaure la position précédente du parcours telle que sauvegardée
par la fonction MarkPosCustomScan
. Cette
fonction callback est facultative, et n'a besoin d'être fournie
que si le drapeau CUSTOMPATH_SUPPORT_MARK_RESTORE
est positionné.
Size (*EstimateDSMCustomScan) (CustomScanState *node, ParallelContext *pcxt);
Estime la quantité de mémoire partagée dynamique qui sera requise pour l'opération parallèlisée. Elle pourrait être plus importante que la quantité réellement utilisée, mais elle ne doit pas être moindre. La valeur en retour est en octets. Cette fonction est optionnelle. Elle n'est nécessaire que si ce type de parcours supporte une exécution parallélisée.
void (*InitializeDSMCustomScan) (CustomScanState *node, ParallelContext *pcxt, void *coordinate);
Initialise la mémoire partagée dynamique requise pour une opération
parallélisée. L'argument coordinate
pointe vers une
partie de la mémoire partagée de taille identique à la valeur en retour de
EstimateDSMCustomScan
. Cette fonction est
optionnelle. Elle n'est nécessaire que si ce type de parcours supporte une
exécution parallélisée.
void (*ReInitializeDSMCustomScan) (CustomScanState *node, ParallelContext *pcxt, void *coordinate);
Ré-initialise la mémoire partagée dynamique requise pour des opérations
parallélisées lorsque le noeud du plan pour le parcours personnalisé doit
être réalisé de nouveau. Cette fonction est optionnelle et doit seulement
être fournie si le fournisseur de ce parcours personnalisé supporte les
exécutions parallélisées. La pratique recommandée est que cette fonction
réinitialise seulement l'état partagé alors que la fonction
ReScanCustomScan
réinitialise seulement l'état local.
Actuellement, cette fonction sera appelée avant
ReScanCustomScan
mais il est préférable de ne pas se
fier à l'ordre des opérations.
void (*InitializeWorkerCustomScan) (CustomScanState *node, shm_toc *toc, void *coordinate);
Initialise un état local d'un processus en parallèle basé sur la
configuration de l'état partagée dans le processus principal par
InitializeDSMCustomScan
. Cette fonction est
optionnelle. Elle n'est nécessaire que si le fournisseur de ce parcours
personnalisé supporte une exécution parallélisée.
void (*ShutdownCustomScan) (CustomScanState *node);
Libère les ressources quand il est anticipé que le nœud ne sera pas exécuté
entièrement. Cette fonction ne sera pas appelée dans tous les cas;
parfois, EndCustomScan
peut être appelée sans que cette
ait été appelée avant. Puisque le segment DSM utilisé par les requêtes
parallèles est détruit juste après que ce callback soit appelé, les modules
de parcours personnalisés qui désirent effectuer des actions avant que le
segment DSM disparaissent devraient implémenter cette méthode.
void (*ExplainCustomScan) (CustomScanState *node, List *ancestors, ExplainState *es);
Envoie sur la sortie des informations additionnelles pour la commande
EXPLAIN
d'un nœud du plan d'un parcours
personnalisé. Cette fonction est facultative. Les données communes
enregistrées dans la structure ScanState
,
tel que la liste des cibles et la relation parcourue, seront
montrées même sans cette fonction callback, mais la fonction permet
l'affichage d'états additionnels, privés.