Thread: RE: Re: [SQL] possible row locking bug in 7.0.3 & 7.1
> > >> I assume this is not possible in 7.1? > > > > > >Just looked in heapam.c - I can fix it in two hours. > > >The question is - should we do this now? > > >Comments? > > > > It's a bug; how confident are you of the fix? 95% -:) > I doubt if it's a bug of SELECT. Well what > 'concurrent UPDATE then SELECT FOR UPDATE + > SELECT' return ? I'm going to add additional check to heapgettup and heap_fetch: HeapTupleSatisfies(T) is TRUE: IF XactIsoLevel is READ_COMMITTED and snapshot != SnapshotDirty and !(T->t_data->t_infomask & HEAP_XMAX_INVALID) and T->t_data->t_infomask & HEAP_XMAX_COMMITTED and T->t_self != T->t_data->t_ctid { FOR ( ; ; ) { fetch tuple->t_data->t_ctid tuple IF t_infomask & (HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE) break;-- and return T IF t_infomask & HEAP_XMAX_COMMITTED { IF t_self != ctid -- updated continue; break;-- deleted, return T } -- uncommitted update/delete IF t_xmax != CurrentTransactionID break; -- and returnT -- changed by current TX! IF changed *BEFORE* this query began { -- DELETE + SELECT: nothing to return -- UPDATE + SELECT: newer tuple version -- will be/was returned by query return NULL; } continue; } } Vadim
"Mikheev, Vadim" wrote: > > > > >> I assume this is not possible in 7.1? > > > > > > > >Just looked in heapam.c - I can fix it in two hours. > > > >The question is - should we do this now? > > > >Comments? > > > > > > It's a bug; how confident are you of the fix? > > 95% -:) > > > I doubt if it's a bug of SELECT. Well what > > 'concurrent UPDATE then SELECT FOR UPDATE + > > SELECT' return ? > > I'm going to add additional check to heapgettup and > heap_fetch: > SELECT seems to be able to return a different result from that of preceding SELECT FOR UPDATE even after applying your change. SELECT doesn't seem guilty but the result is far from intuitive. It seems impossoble for all queires inside such a function to use a common snapshot. regards, Hiroshi Inoue