Re: bug in Prepared statement with DELETE RETURNING and rule on view - Mailing list pgsql-bugs

From Amit Kapila
Subject Re: bug in Prepared statement with DELETE RETURNING and rule on view
Date
Msg-id 00b101ce5bb3$840448f0$8c0cdad0$@kapila@huawei.com
Whole thread Raw
In response to bug in Prepared statement with DELETE RETURNING and rule on view  (Brice André <brice@famille-andre.be>)
Responses Re: bug in Prepared statement with DELETE RETURNING and rule on view  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
On Tuesday, May 28, 2013 6:50 PM Brice Andr=E9 wrote:
> Hello Amit,
>=20
> Thanks for your answer.
>=20
> The reason why it does not work is still not really clear for me .What
> I find very strange is that, if you perform exactly same request, with
> exactly same C++ code, but that you change the database schema so that
> the ON DELETE rule of the view really deletes elements, it works
> properly. The inconsistency between both cases looks very strange to
> me.

What happens when you change ON DELETE rule of the view that really =
deletes
elements is that command type after applying rule remains same which =
means
Delete, so it can set the Tag.
Refer Function QueryRewrite().
Setting tag means after sql statement execution, it tells you the number =
of
elements affected. For example
1. when your rule is such that it internally updates, it will mention =
after
sql execution as=20
DELETE 0
2. when your rule is such that it internally deletes, it will mention =
after
sql execution as
DELETE 81

Now based on whether you can set the tag or not, ChoosePortalStrategy() =
will
decide portal strategy (PORTAL_ONE_RETURNING or PORTAL_RUN_MULTI).
When the rule is to do update, in that case it choose PORTAL_RUN_MULTI =
which
doesn't send tuples.


This is very old code, not sure how we can change to make it work for =
your
case. I had mentioned my analysis related to code so that others can =
also
give suggestions.

=20
> Thank you for your workaround. I will test it and, if it works, I will
> use it as, I agree with you, it should meet my performance
> requirements.Note that my application can perform some SQL requests
> thousands of time during the same server session. So, for me, using
> prepared statement is an important feature !



> Thanks for your help.
> Regards,
> Brice
>=20
> 2013/5/28 Amit Kapila <amit.kapila@huawei.com>:
> > On Tuesday, May 28, 2013 1:54 PM Brice Andr=E9 wrote:
> >> On Tuesday, May 28, 2013 1:28 PM Brice Andr=E9 wrote:
> >>
> >> I shall look into it today in later half of the day.
> >> > Dear Amit,
> >> >
> >> > Thanks for your answer.
> >> >
> >> > I performed the same test as you and I get the same result (on my
> >> > linux server, debian, postgresql 8.4).
> >> >
> >> > Maybe the problem is related to libpq ?
> >> >
> >> > Did you tried the C code provided to see if you can reproduce the
> >> > problem ?
> >
> > I checked your C code and found the reason why you are not able to
> get the
> > tuples returned by "Delete .. Returning .."
> >
> > Currently it is not supported to return tuples for non-select
> statements
> > using PQexecPrepared and the reason is, there is
> > no provision for Describe to send a RowDescription during this
> execution.
> > You can refer function PortalRunMulti() in code, if you want to know
> > more details.
> >
> > I could see below way for you to change your application if you want
> rows
> > returned by "Delete .. Returning .."
> > Use PQexec for below sql statements:
> >
> > prepare t1plan (int,int) AS Delete from v1 where c1 between $1  and
> $2
> > returning c1,deleted;
> > Execute t1plan(10,90);
> >
> > After preparing once, you can call Execute SQL statement multiple
> times, it
> > can save your time of prepare each time of delete statement, which
> was
> > your motto for using PQexecPrepared().
> >
> >>
> >> >
> >> > 2013/5/28 Amit Kapila <amit.kapila@huawei.com>:
> >> > > On Tuesday, May 28, 2013 12:39 AM Brice Andr=E9 wrote:
> >> > >> Dear all,
> >> > >>
> >> > >> I found what I really think is a bug in the postgresql 8.4.
> >> > >>
> >> > >> I have an sql database structure in which a real table has a
> >> column
> >> > >> that is used to mark the entries as deleted without really
> >> deleting
> >> > >> them. Then, I have a view that is hiding this to the users,
> with
> >> > proper
> >> > >> rules that perform real actions on the table. So, a ON DELETE
> rule
> >> > on
> >> > >> this view is performing an UPDATE which marks the rows as
> delete
> >> > >> without deleting them. The view is hiding the rows tagged as
> >> > deleted.
> >> > >>
> >> > >> This code is working from several years and I have a web-
> service
> >> > that
> >> > >> performs several actions on top of this database. Those =
actions
> >> > include
> >> > >> a "DELETE ... RETURNING ..." command on the view. This web-
> service
> >> > was
> >> > >> implemented by a php script that did not use any prepared
> >> statement,
> >> > >> and everything was working properly.
> >> > >>
> >> > >> I had performance issue with this solution and I decided to
> >> rewrite
> >> > the
> >> > >> service in C++, and to use prepared statements. The SQL
> commands
> >> are
> >> > >> exactly the same, but they are now executed from a C++
> application
> >> > >> using libpq, and they use prepared statements.
> >> > >
> >> > > I had tried in latest 9.3 code with psql using prepared
> statements
> >> > and it
> >> > > worked fine, please see result below.
> >> > > I shall check your libpq application code as well, but in the
> mean
> >> > time can
> >> > > you please verify whether the below works for you on 8.4 (I
> don't
> >> > have 8.4
> >> > > setup).
> >> > >
> >> > >
> >> > > postgres=3D> prepare t1plan (int,int) AS Delete from v1 where =
c1
> >> > between $1
> >> > > and $2
> >> > >  returning c1,deleted;
> >> > > PREPARE
> >> > > postgres=3D> Execute t1plan(10,90);
> >> > >  c1 | deleted
> >> > > ----+---------
> >> > >  10 | t
> >> > >  11 | t
> >> > >  12 | t
> >> > >  13 | t
> >> > >  14 | t
> >> > >  15 | t
> >> > >  16 | t
> >> > >  17 | t
> >> > >  18 | t
> >> > >  19 | t
> >> > >  20 | t
> >> > >  21 | t
> >> > >  22 | t
> >> > >  23 | t
> >> > >  24 | t
> >> > >  25 | t
> >> > >  26 | t
> >> > >  27 | t
> >> > >  28 | t
> >> > >  29 | t
> >> > >  30 | t
> >> > >  31 | t
> >> > >  32 | t
> >> > >  33 | t
> >> > >  34 | t
> >> > >  35 | t
> >> > >  36 | t
> >> > >  37 | t
> >> > >  38 | t
> >> > >  39 | t
> >> > >  40 | t
> >> > >  41 | t
> >> > >  42 | t
> >> > >  43 | t
> >> > >  44 | t
> >> > >  45 | t
> >> > >  46 | t
> >> > >  47 | t
> >> > >  48 | t
> >> > >  49 | t
> >> > >  50 | t
> >> > >  51 | t
> >> > >  52 | t
> >> > >  53 | t
> >> > >  54 | t
> >> > >  55 | t
> >> > >  56 | t
> >> > >  57 | t
> >> > >  58 | t
> >> > >  59 | t
> >> > >  60 | t
> >> > >  61 | t
> >> > >  62 | t
> >> > >  63 | t
> >> > >  64 | t
> >> > >  65 | t
> >> > >  66 | t
> >> > >  67 | t
> >> > >  68 | t
> >> > >  69 | t
> >> > >  70 | t
> >> > >  71 | t
> >> > >  72 | t
> >> > >  73 | t
> >> > >  74 | t
> >> > >  75 | t
> >> > >  76 | t
> >> > >  77 | t
> >> > >  78 | t
> >> > >  79 | t
> >> > >  80 | t
> >> > >  81 | t
> >> > >  82 | t
> >> > >  83 | t
> >> > >  84 | t
> >> > >  85 | t
> >> > >  86 | t
> >> > >  87 | t
> >> > >  88 | t
> >> > >  89 | t
> >> > >  90 | t
> >> > > (81 rows)
> >> > >
> >> > >
> >> > > DELETE 0
> >> > >
> >> > > With Regards,
> >> > > Amit Kapila.
> >> > >
> >>
> >>
> >>
> >> --
> >> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> >> To make changes to your subscription:
> >> http://www.postgresql.org/mailpref/pgsql-bugs
> >

pgsql-bugs by date:

Previous
From: hubert depesz lubaczewski
Date:
Subject: Re: BUG #8183: field timestamp result to date
Next
From: Tudor Barascu
Date:
Subject: Re: BUG #8172: entering the hostname in the address column in pg_hba.conf doesn't work as it should