The executor takes the plan handed back by the
    planner/optimizer and starts processing the top node. In the case of
    our example (the query given in example \ref{simple_select}) the top
    node is a MergeJoin node. 
   
    Before any merge can be done two tuples have to be fetched (one from
    each subplan). So the executor recursively calls itself to
    process the subplans (it starts with the subplan attached to
    lefttree). The new top node (the top node of the left subplan) is a
    SeqScan node and again a tuple has to be fetched before the node
    itself can be processed. The executor calls itself recursively
    another time for the subplan attached to lefttree of the
    SeqScan node.
   
    Now the new top node is a Sort node. As a sort has to be done on
    the whole relation, the executor starts fetching tuples
    from the Sort node's subplan and sorts them into a temporary
    relation (in memory or a file) when the Sort node is visited for
    the first time. (Further examinations of the Sort node will
    always return just one tuple from the sorted temporary
    relation.)
   
    Every time the processing of the Sort node needs a new tuple the
    executor is recursively called for the SeqScan node
    attached as subplan. The relation (internally referenced by the
    value given in the scanrelid field) is scanned for the next
    tuple. If the tuple satisfies the qualification given by the tree
    attached to qpqual it is handed back, otherwise the next tuple
    is fetched until the qualification is satisfied. If the last tuple of
    the relation has been processed a NULL pointer is
    returned.
   
    After a tuple has been handed back by the lefttree of the
    MergeJoin the righttree is processed in the same way. If both
    tuples are present the executor processes the MergeJoin
    node. Whenever a new tuple from one of the subplans is needed a
    recursive call to the executor is performed to obtain it. If a
    joined tuple could be created it is handed back and one complete
    processing of the plan tree has finished. 
   
    Now the described steps are performed once for every tuple, until a
    NULL pointer is returned for the processing of the
    MergeJoin node, indicating that we are finished.