On Thu, May 28, 2020 at 3:06 PM Amit Langote <amitlangot...@gmail.com> wrote:
> On Thu, May 28, 2020 at 1:36 PM amul sul <sula...@gmail.com> wrote: > > On Wed, May 27, 2020 at 12:53 PM Amit Langote <amitlangot...@gmail.com> > wrote: > >> Actually, if you declare the cursor without FOR SHARE/UPDATE, the case > >> would fail even with traditional inheritance: > >> > >> drop table if exists p cascade; > >> create table p (a int); > >> create table c (check (a = 2)) inherits (p); > >> insert into p values (1); > >> insert into c values (2); > >> begin; > >> declare c cursor for select * from p where a = 1; > >> fetch c; > >> update p set a = a where current of c; > >> ERROR: cursor "c" is not a simply updatable scan of table "c" > >> ROLLBACK > >> > > > > I am not sure I understood the point, you'll see the same error with > declarative > > partitioning as well. > > My point is that if a table is not present in the cursor's plan, there > is no way for CURRENT OF to access it. Giving an error in that case > seems justified. > > OTOH, when the CURRENT OF implementation has RowMarks to look at, it > avoids the error for traditional inheritance children due their > inactive RowMarks being present in the cursor's PlannedStmt. I think > that's only by accident though. > Yeah, make sense, thank you. Regards, Amul