2014/1/12 Marko Tiikkaja <ma...@joh.to>

> On 1/12/14, 7:47 AM, Pavel Stehule wrote:
>
>> 2014/1/12 Marko Tiikkaja <ma...@joh.to>
>>
>>  Greetings fellow elephants,
>>>
>>> I would humbly like to submit for your consideration my proposal for
>>> alleviating pain caused by one of the most annoying footguns in PL/PgSQL:
>>> the behaviour of SELECT .. INTO when the query returns more than one row.
>>>   Some of you might know that no exception is raised in this case (as
>>> opposed to INSERT/UPDATE/DELETE .. INTO, all of them yielding
>>> TOO_MANY_ROWS), which can hide subtle bugs in queries if during testing
>>> the
>>> query always returns only one row or the "correct" one happens to be
>>> picked
>>> up every time.  Additionally, the row_count() after execution is always
>>> going to be either 0 or 1, so even if you want to explicitly guard
>>> against
>>> potentially broken queries, you can't do so!
>>>
>>>
>> It is not bad and, sure, - it is very useful and important
>>
>> but - it is a redundant to INTO STRICT clause. When you use it, then you
>> change a INTO behaviour. Is not better to ensure STRICT option than hidden
>> redefining INTO?
>>
>
> That only works if the query should never return 0 rows either.  If you
> want to allow for missing rows, STRICT is out of the question.


hmm - you have true.

try to find better name.

Other questions is using a GUC for legacy code. I am for this checked mode
be default (or can be simply activated for new code)

Regards

Pavel


>
>
>  Option INTO (without STRICT clause) is not safe and we should to disallow.
>> I see a three states (not only two)
>>
>> a) disallow INTO without STRICT (as preferred for new code)
>> b) implicit check after every INTO without STRICT
>> c) without check
>>
>> these modes should be: "strict_required", "strict_default",
>> "strict_legacy"
>>
>
> I can't get excited about this.  Mostly because it doesn't solve the
> problem I'm having.
>
> It is important to be able to execute queries with INTO which might not
> return a row.  That's what FOUND is for.
>
>
>  So I added the following compile-time option:
>>>
>>>
>>> set plpgsql.consistent_into to true;
>>>
>>>
>> This name is not best (there is not clean with it a into should be
>> consistent)
>>
>
> I agree, but I had to pick something.  One of the three hard problems in
> CS..
>
>
>  Is question, if this functionality should be enabled by GUC to be used for
>> legacy code (as protection against some kind of hidden bugs)
>>
>> This topic is interesting idea for me - some checks can be pushed to
>> plpgsql_check (as errors or warnings) too.
>>
>> Generally I like proposed functionality, just I am not sure, so hidden
>> redefining INTO clause (to INTO STRICT) is what we want. We can do it (but
>> explicitly). I don't know any situation where INTO without STRICT is
>> valid.
>> Introduction of STRICT option was wrong idea - and now is not way to back.
>>
>
> Note that this is different from implicitly STRICTifying every INTO, like
> I said above.
>
>
> Regards,
> Marko Tiikkaja
>

Reply via email to