From: | Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at> |
---|---|
To: | "Dmitriy Igrishin *EXTERN*" <dmitigr(at)gmail(dot)com> |
Cc: | "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: [HACKERS] Frontend/backend protocol improvements proposal (request). |
Date: | 2013-06-28 07:35:14 |
Message-ID: | A737B7A37273E048B164557ADEF4A58B17BC1547@ntex2010a.host.magwien.gv.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general pgsql-hackers |
Dmitriy Igrishin wrote:
>> Since there can be only one unnamed prepared statement per
>> session, there should be only one such object per connection.
>> It should not get deallocated; maybe it could be private to the
>> connection, which only offers a "parseUnnamed" and "executeUnnamed"
>> mathod.
>
> More precisely, there can be only one uniquely named prepared statement (named
> or unnamed) per session.
> Could you provide a signature of parseUnnamed and executeUnnamed please?
> I don't clearly understand this approach.
I'm just brainstorming.
I'm thinking of something like
void Connection::prepareUnnamed(const char *query,
int nParams,
const Oid *paramTypes);
and
Result Connection::executeUnnamed(int nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
But I'm not saying that this is the perfect solution.
>> If you really want your users to be able to set prepared statement
>> names, you'd have to warn them to be careful to avoid the
>> problem of name collision -- you'd handle the burden to them.
>> That's of course also a possible way, but I thought you wanted
>> to avoid that.
>
> The mentioned burden is already handled by backend which throws
> duplicate_prepared_statement (42P05) error.
I mean the problem that you create a prepared statement,
then issue "DEALLOCATE stmt_name" create a new prepared statement
with the same name and then use the first prepared statement.
>>> Prepared_statement* pst1 = connection->describe("name");
>>> Prepared_statement* pst2 = connection->describe("name"); // pst2 points to the same remote
>>> object
>>
>> That seems like bad design to me.
>> I wouldn't allow different objects pointing to the same prepared
>> statement. What is the benefit?
>> Shouldn't the model represent reality?
>
> Well, then the C and C++ languages are bad designed too, because they
> allow to have as many pointers to the same as the user like (needs) :-)
That's a different thing, because all these pointers contain the same
value. So if pst1 and pst2 represent the same object, I'd like
pst1 == pst2 to be true.
> Really, I don't see bad design here. Describing prepared statement
> multiple times will results in allocating several independent descriptors.
... but for the same prepared statement.
> (As with, for example, performing two SELECTs will result in allocating
> several independent results by libpq.)
But those would be two different statement to PostgreSQL, even if the
query strings are identical.
Mind you, I'm not saying that I am the person that decides what is
good taste and what not, I'm just sharing my sentiments.
>> Of course an error during DEALLOCATE should be ignored in that case.
>> It's hard to conceive of a case where deallocation fails, but the
>> connection is fine. And if the connection is closed, the statement
>> will be deallocated anyway.
>
> Why this error should be ignored? I believe that this should be decided by the user.
> As a library author I don't know (and cannot know) how to react on such errors
> in the end applications.
Again, I would say that that is a matter of taste.
I just cannot think of a case where this would be important.
>>> Btw, by the reason 2) there are no any transaction RAII classes as in some other libraries,
>>> because the ROLLBACK command should be executed in the destructor and may throw.
>>
>> I tend to believe that such errors could also be ignored.
>> If ROLLBACK (or anything else) throws an error, the transaction will
>> get rolled back anyway.
>
> Perhaps, but, again, I don't know how the user will prefer to react. So, I prefer just
> to throw and allow the user to decide.
Agreed, it's a matter of taste.
Yours,
Laurenz Albe
From | Date | Subject | |
---|---|---|---|
Next Message | Jiří Pavlovský | 2013-06-28 07:39:27 | Re: utf8 errors |
Previous Message | Alban Hertroys | 2013-06-28 07:09:32 | Re: utf8 errors |
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Freund | 2013-06-28 07:52:12 | Re: Support for REINDEX CONCURRENTLY |
Previous Message | Jeevan Chalke | 2013-06-28 07:32:17 | Re: checking variadic "any" argument in parser - should be array |