• Tom Lane's avatar
    Fix WHERE CURRENT OF when the referenced cursor uses an index-only scan. · 8f5ac440
    Tom Lane authored
    "UPDATE/DELETE WHERE CURRENT OF cursor_name" failed, with an error message
    like "cannot extract system attribute from virtual tuple", if the cursor
    was using a index-only scan for the target table.  Fix it by digging the
    current TID out of the indexscan state.
    
    It seems likely that the same failure could occur for CustomScan plans
    and perhaps some FDW plan types, so that leaving this to be treated as an
    internal error with an obscure message isn't as good an idea as it first
    seemed.  Hence, add a bit of heaptuple.c infrastructure to let us deliver
    a more on-topic message.  I chose to make the message match what you get
    for the case where execCurrentOf can't identify the target scan node at
    all, "cursor "foo" is not a simply updatable scan of table "bar"".
    Perhaps it should be different, but we can always adjust that later.
    
    In the future, it might be nice to provide hooks that would let custom
    scan providers and/or FDWs deal with this in other ways; but that's
    not a suitable topic for a back-patchable bug fix.
    
    It's been like this all along, so back-patch to all supported branches.
    
    Yugo Nagata and Tom Lane
    
    Discussion: https://postgr.es/m/20180201013349.937dfc5f.nagata@sraoss.co.jp
    8f5ac440
tuptable.h 8.61 KB