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é.
void (*ExplainCustomScan) (CustomScanState *node, List *ancestors, ExplainState *es);
Envoie sur la sortie des informations additionnelles pour la commande EXPLAIN d'un nøeud 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.