Обсуждение: Custom TupleTableSlotOps while Initializing Custom Scan
I have been working on adding a CustomScanState object in the executor state in my project. As part of CustomScanState, I execute queries and store their results in the Tuplestorestate object. After storing all tuples in the Tuplestorestate, I retrieve each tuple and place it in the TupleTableSlot using the tuplestore_gettupleslot() function.
However, I encounter an error: "trying to store a minimal tuple into the wrong type of slot." Upon debugging, I discovered that the TupleTableSlot only holds virtual tuples (tupleTableSlot->tts_ops is set to TTSOpsVirtual). In contrast, tuplestore_gettupleslot() calls ExecStoreMinimalTuple(), which expects TupleTableSlotOps of type TTSOpsMinimalTuple.
Further investigation revealed that in the ExecInitCustomScan() function within the nodeCustom.c source file, where ScanTupleSlot and ResultTupleSlots are initialized, users can choose custom slots by setting slotOps in CustomScanState. We initialize the ScanTupleSlot based on user-specified slotOps, but for ResultTupleSlot, we proceed with TTSOpsVirtual instead of the custom slotOps, which is causing the issue.
Is this behavior expected? Is there a way to store tuples in slots according to the TupleTableSlot type?
I found a function ExecForceStoreMinimalTuple() which can be used in my case. We need to pass the MinimalTuple to this function, but I was unable to find a way to fetch the tuple from tuple storestate. We do have tuplestore_gettuple() function to get the minimal tuple but it is a static function, is there any other function like that?
Below is the code snippet of ExecInitCustomScan() , for simplicity I removed some code in the function. I took it from the nodeCustom.c file in the PG source.
Hello Team,Good Day,I have been working on adding a
CustomScanStateobject in the executor state in my project. As part ofCustomScanState, I execute queries and store their results in theTuplestorestateobject. After storing all tuples in theTuplestorestate, I retrieve each tuple and place it in theTupleTableSlotusing thetuplestore_gettupleslot()function.However, I encounter an error: "trying to store a minimal tuple into the wrong type of slot." Upon debugging, I discovered that the
TupleTableSlotonly holds virtual tuples (tupleTableSlot->tts_opsis set toTTSOpsVirtual). In contrast,tuplestore_gettupleslot()callsExecStoreMinimalTuple(), which expectsTupleTableSlotOpsof typeTTSOpsMinimalTuple.Further investigation revealed that in the
ExecInitCustomScan()function within thenodeCustom.csource file, whereScanTupleSlotandResultTupleSlotsare initialized, users can choose custom slots by settingslotOpsinCustomScanState. We initialize theScanTupleSlotbased on user-specifiedslotOps, but forResultTupleSlot, we proceed withTTSOpsVirtualinstead of the customslotOps, which is causing the issue.Is this behavior expected? Is there a way to store tuples in slots according to the
TupleTableSlottype?
I found a functionExecForceStoreMinimalTuple()which can be used in my case. We need to pass the MinimalTuple to this function, but I was unable to find a way to fetch the tuple from tuple storestate. We do havetuplestore_gettuple() function to get the minimal tuple but it is a static function, is there any other function like that?