Thread: Re: [BUGS] BUG #4027: backslash escaping not disabled in plpgsql

Re: [BUGS] BUG #4027: backslash escaping not disabled in plpgsql

From
Bruce Momjian
Date:
Peter Eisentraut wrote:
> Tom Lane wrote:
> > plpgsql does not consider standard_conforming_strings --- it still uses
> > backslash escaping in its function bodies regardless.  Since the
> > language itself is not standardized, I see no particular reason that
> > standard_conforming_strings should govern it.
> 
> I think plpgsql should behave either consistently with the rest of PostgreSQL 
> or with Oracle, which it is copied from.
> 
> > I believe the reason for 
> > not changing it was that it seemed too likely to break existing
> > functions, with potentially nasty consequences if they chanced to be
> > security definers.
> 
> Is this actually true or did we just forget it? :-)

I have added this TODO item:
Consider honoring standard_conforming_strings in PL/pgSQL functionbodies    *
http://archives.postgresql.org/pgsql-bugs/2008-03/msg00102.php
 

Are we every going to enable standard_conforming_strings by default?  If
not, I will remove the TODO item mentiong this. 
standard_conforming_strings was added in Postgres 8.1, and
escape_string_warning was enabled in 8.2.

I think the big issue is that having standard_conforming_strings affect
function behavior introduces the same problems we have had in the past
of having a GUC affect function behavior.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: Re: [BUGS] BUG #4027: backslash escaping not disabled in plpgsql

From
Robert Haas
Date:
On Thu, Apr 9, 2009 at 11:16 AM, Bruce Momjian <bruce@momjian.us> wrote:
> Peter Eisentraut wrote:
>> Tom Lane wrote:
>> > plpgsql does not consider standard_conforming_strings --- it still uses
>> > backslash escaping in its function bodies regardless.  Since the
>> > language itself is not standardized, I see no particular reason that
>> > standard_conforming_strings should govern it.
>>
>> I think plpgsql should behave either consistently with the rest of PostgreSQL
>> or with Oracle, which it is copied from.
>>
>> > I believe the reason for
>> > not changing it was that it seemed too likely to break existing
>> > functions, with potentially nasty consequences if they chanced to be
>> > security definers.
>>
>> Is this actually true or did we just forget it? :-)
>
> I have added this TODO item:
>
>        Consider honoring standard_conforming_strings in PL/pgSQL function
>        bodies
>
>            * http://archives.postgresql.org/pgsql-bugs/2008-03/msg00102.php
>
> Are we every going to enable standard_conforming_strings by default?  If
> not, I will remove the TODO item mentiong this.
> standard_conforming_strings was added in Postgres 8.1, and
> escape_string_warning was enabled in 8.2.
>
> I think the big issue is that having standard_conforming_strings affect
> function behavior introduces the same problems we have had in the past
> of having a GUC affect function behavior.

I think this should wait at least one more release.  Based on my
experience, there are probably a LOT of applications out there that
have yet to be updated.

It wouldn't bother me if we never enabled it by default, either.  I'm
just -1 on doing it now.

...Robert


Re: [BUGS] BUG #4027: backslash escaping not disabled inplpgsql

From
"Kevin Grittner"
Date:
Bruce Momjian <bruce@momjian.us> wrote:
> standard_conforming_strings was added in Postgres 8.1, and
> escape_string_warning was enabled in 8.2.
Other way around -- the warning was available in 8.1; the standard
character string literals were available in 8.2.

> I think the big issue is that having standard_conforming_strings
> affect function behavior introduces the same problems we have had in
> the past of having a GUC affect function behavior.
Can't that be managed with this CREATE FUNCTION option?:
SET configuration_parameter { TO value | = value | FROM CURRENT }
I would like to see standard character string literals at least
available in PL/pgSQL, although I don't personally care whether it is
the default or whether I need to specify it with the above option. 
Might it not confuse people to have this GUC behave differently than
others, though?
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping not disabled inplpgsql

From
Tom Lane
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> Bruce Momjian <bruce@momjian.us> wrote:
>> I think the big issue is that having standard_conforming_strings
>> affect function behavior introduces the same problems we have had in
>> the past of having a GUC affect function behavior.
> Can't that be managed with this CREATE FUNCTION option?:
> SET configuration_parameter { TO value | = value | FROM CURRENT }

It can be, the question is whether we're prepared to break everything
under the sun until people add that.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping not disabled inplpgsql

From
Bruce Momjian
Date:
Tom Lane wrote:
> "Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> > Bruce Momjian <bruce@momjian.us> wrote:
> >> I think the big issue is that having standard_conforming_strings
> >> affect function behavior introduces the same problems we have had in
> >> the past of having a GUC affect function behavior.
>  
> > Can't that be managed with this CREATE FUNCTION option?:
> > SET configuration_parameter { TO value | = value | FROM CURRENT }
> 
> It can be, the question is whether we're prepared to break everything
> under the sun until people add that.

I think we would first have to agree to issue escape_string_warning
warnings for code in PL/pgSQL functions, then think about having
standard_conforming_strings control PL/pgSQL behavior;  this is what we
did with SQL and it seems to have worked.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: Re: [BUGS] BUG #4027: backslash escaping not disabled inplpgsql

From
"Kevin Grittner"
Date:
Tom Lane <tgl@sss.pgh.pa.us> wrote: 
> "Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
>> Can't that be managed with this CREATE FUNCTION option?:
>> SET configuration_parameter { TO value | = value | FROM CURRENT }
> 
> It can be, the question is whether we're prepared to break
everything
> under the sun until people add that.
Well, surely the 8.3 behavior is not what we want.
(1)  The plpgsql parser identifies the boundaries of the string based
on backslash escapes.
(2)  The character string literal is interpreted based on the GUC
setting the first time the function is executed (and presumably the
first time executed after the function's invalidated).
(3)  Subsequent changes to the GUC don't affect how it's interpreted.
scca=# show standard_conforming_strings ;standard_conforming_strings
-----------------------------on
(1 row)

scca=# create or replace function kjgtest() returns text language
plpgsql immutable strict as $$ begin return '\x49'; end; $$;
CREATE FUNCTION
scca=# select * from kjgtest();kjgtest
---------\x49
(1 row)

scca=# set standard_conforming_strings = off;
SET
scca=# select * from kjgtest();kjgtest
---------\x49
(1 row)

scca=# create or replace function kjgtest() returns text language
plpgsql immutable strict as $$ begin return '\x49'; end; $$;
CREATE FUNCTION
scca=# select * from kjgtest();kjgtest
---------I
(1 row)

scca=# set standard_conforming_strings = on;
SET
scca=# select * from kjgtest();kjgtest
---------I
(1 row)

scca=# create or replace function kjgtest() returns text language
plpgsql immutable strict as $$ begin return '\x49'; end; $$;
CREATE FUNCTION
scca=# set standard_conforming_strings = off;
SET
scca=# select * from kjgtest();kjgtest
---------I
(1 row)
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping not disabled inplpgsql

From
Tom Lane
Date:
Bruce Momjian <bruce@momjian.us> writes:
> Tom Lane wrote:
>> It can be, the question is whether we're prepared to break everything
>> under the sun until people add that.

> I think we would first have to agree to issue escape_string_warning
> warnings for code in PL/pgSQL functions, then think about having
> standard_conforming_strings control PL/pgSQL behavior;  this is what we
> did with SQL and it seems to have worked.

Well, considering that we are still afraid to pull the trigger on
changing the standard_conforming_strings default, it's a bit premature
to claim that it "worked" for SQL.  But I agree that some kind of
stepwise process will be necessary if we want to try to change this.

IIRC there was some discussion of using plpgsql's (undocumented) #option
syntax to control this, rather than having a GUC that would be specific
to plpgsql.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
"Kevin Grittner"
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> wrote: 
> Well, surely the 8.3 behavior is not what we want.
Unless I'm missing something, plpgsql *already* effectively recognizes
and respects the standard_conforming_strings GUC *except* as the last
character of a conforming string literal within the procedure body,
and then not always. Am I missing something here?
scca=# set standard_conforming_strings = on;
SET
scca=# create or replace function kjgtest() returns text language
plpgsql immutable as 'begin return \'\x49\'; end;';
Expanded display is on.
Invalid command \';. Try \? for help.
scca=# \x
Expanded display is off.
scca-# create or replace function kjgtest() returns text language
plpgsql immutable as $$ begin return '\x49\'; end; $$;
ERROR:  syntax error at or near "create"
LINE 2: create or replace function kjgtest() returns text language
p...       ^
scca=# create or replace function kjgtest() returns text language
plpgsql immutable as $$ begin return '\x49\\'; end; $$;
CREATE FUNCTION
scca=# select kjgtest();kjgtest
---------\x49\\
(1 row)

scca=# set standard_conforming_strings = off;
SET
scca=# create or replace function kjgtest() returns text language
plpgsql immutable as 'begin return \'\x49\'; end;';
CREATE FUNCTION
scca=# select kjgtest();kjgtest
---------I
(1 row)

scca=# create or replace function kjgtest() returns text language
plpgsql immutable as $$ begin return '\x49\'; end; $$;
ERROR:  unterminated string
CONTEXT:  compile of PL/pgSQL function "kjgtest" near line 1
scca=# create or replace function kjgtest() returns text language
plpgsql immutable as $$ begin return '\x49\\'; end; $$;
CREATE FUNCTION
scca=# select kjgtest();kjgtest
---------I\
(1 row)
Given this behavior, how much could be working for
standard_conforming_strings = on which would break with more complete
support?  Maybe this particular GUC should default to an implied SET
standard_conforming_strings FROM CURRENT and the plpgsql parser should
use it?  Can anyone show a working case that would break with that?
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Tom Lane
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> Unless I'm missing something, plpgsql *already* effectively recognizes
> and respects the standard_conforming_strings GUC *except* as the last
> character of a conforming string literal within the procedure body,
> and then not always. Am I missing something here?

Yes --- I think you are confusing parsing of the string literal that
is the argument of CREATE FUNCTION with the parsing that the plpgsql
interpreter does on the function body once it gets it.  In particular,
this example:

create or replace function kjgtest() returns text language
plpgsql immutable as $$ begin return 'foo\'; end; $$;

fails regardless of the standard_conforming_strings setting, because
the plpgsql interpreter considers the backslash to escape the quote
regardless.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
"Kevin Grittner"
Date:
Tom Lane <tgl@sss.pgh.pa.us> wrote: 
> I think you are confusing parsing of the string literal that
> is the argument of CREATE FUNCTION with the parsing that the plpgsql
> interpreter does on the function body once it gets it.  In
> particular, this example:
> 
> create or replace function kjgtest() returns text language
> plpgsql immutable as $$ begin return 'foo\'; end; $$;
> 
> fails regardless of the standard_conforming_strings setting, because
> the plpgsql interpreter considers the backslash to escape the quote
> regardless.
Oh, I'm not confused about that at all.  I'm arguing that it's a bad
idea.  I agree with the OP that this is a bug.  Did you look at my
other examples of behavior?  In particular:
scca=# create or replace function kjgtest() returns text language
plpgsql immutable as $$ begin return '\x49\\'; end; $$;
CREATE FUNCTION
scca=# select kjgtest();kjgtest
---------\x49\\
(1 row)
Can you show one case where having plgpsql parse the function body
based on the standard_conforming_strings GUC would break *anything*
that now works?  That's an allegation which I haven't been able to
confirm, so I'm wondering about the basis.
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
"Kevin Grittner"
Date:
I wrote: 
> Tom Lane <tgl@sss.pgh.pa.us> wrote: 
>> I think you are confusing parsing of the string literal that
>> is the argument of CREATE FUNCTION with the parsing that the
plpgsql
>> interpreter does on the function body once it gets it.
> Oh, I'm not confused about that at all.  I'm arguing that it's a bad
> idea.
To be more explicit, I see that there is a third parser phase -- when
the function is planned, the original contents of the character string
literal are passed to the normal PostgreSQL execution engine, which
parses them again, potentially using different rules from those used
by the plpgsql interpreter.  I maintain that having the execution
engine use different rules for looking at the value of the literal
than the plpgsql parser used to find the boundaries of the literal
is where the weird corner case bugs come in.
For someone using string literal '\x49\\' in a plpgsql function, the
plpgsql parser sees it as a two character string, but when the
function is actually run, depending on whether the first execution is
using standard string literals, this can be either a two character or
a six character string.  Unless the coder of the function uses the SET
option in declaring the function, they don't know what value will be
used at run time, and it may change from run to run.
It seems to me that we already have exactly the kinds of problems you
say you want to avoid, and that there is an obvious fix to avoid them.
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Tom Lane
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> Tom Lane <tgl@sss.pgh.pa.us> wrote: 
>> I think you are confusing parsing of the string literal that
>> is the argument of CREATE FUNCTION with the parsing that the plpgsql
>> interpreter does on the function body once it gets it.
> Oh, I'm not confused about that at all.  I'm arguing that it's a bad
> idea.  I agree with the OP that this is a bug.  Did you look at my
> other examples of behavior?

I ignored all the ones that used non-dollar-quote syntax for the overall
function body, since they are just confusing the issue.

> Can you show one case where having plgpsql parse the function body
> based on the standard_conforming_strings GUC would break *anything*
> that now works?

regression=# create function foo() returns int as $$
regression$# begin
regression$#   raise notice 'foo\'s bar';
regression$#   return 1;
regression$# end$$ language plpgsql;
CREATE FUNCTION
regression=# select foo();
NOTICE:  foo's barfoo 
-----  1
(1 row)

In this case the string literal isn't actually ever passed to the main
SQL engine, so the SQL quoting rules aren't relevant.  (I don't remember
offhand if anything besides RAISE works that way.)

It may be that this isn't a very important case, but to claim that
it doesn't exist is simply wrong.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
"Kevin Grittner"
Date:
Tom Lane <tgl@sss.pgh.pa.us> wrote: 
>> Can you show one case where having plgpsql parse the function body
>> based on the standard_conforming_strings GUC would break *anything*
>> that now works?
> 
> regression=# create function foo() returns int as $$
> regression$# begin
> regression$#   raise notice 'foo\'s bar';
> regression$#   return 1;
> regression$# end$$ language plpgsql;
> CREATE FUNCTION
> regression=# select foo();
> NOTICE:  foo's bar
>  foo 
> -----
>    1
> (1 row)
> 
> In this case the string literal isn't actually ever passed to the
> main SQL engine, so the SQL quoting rules aren't relevant.  (I don't
> remember offhand if anything besides RAISE works that way.)
> 
> It may be that this isn't a very important case, but to claim that
> it doesn't exist is simply wrong.
OK, I didn't try that.  Point taken.  It is a bigger mess than I
thought then.
The aspect of 8.3 behavior that concerns me most is that neither the
author of a function, nor anyone using it, can control or predict
which way a string literal with a backslash will be interpreted,
unless the author explicitly specifies the SET
standard_conforming_strings clause in the function declaration.  I'm
betting that most people writing and using plpgsql functions don't
know that.  Any thoughts about what can or should be done about that?
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Tom Lane
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> The aspect of 8.3 behavior that concerns me most is that neither the
> author of a function, nor anyone using it, can control or predict
> which way a string literal with a backslash will be interpreted,
> unless the author explicitly specifies the SET
> standard_conforming_strings clause in the function declaration.

Yeah.  This is one reason why I'm still afraid to flip the default
value of standard_conforming_strings --- there seems too much risk
of widespread breakage.

I don't have a good solution for it, but I agree it's a problem.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Brendan Jurd
Date:
On Sat, Apr 11, 2009 at 4:40 AM, Kevin Grittner
<Kevin.Grittner@wicourts.gov> wrote:
> The aspect of 8.3 behavior that concerns me most is that neither the
> author of a function, nor anyone using it, can control or predict
> which way a string literal with a backslash will be interpreted,
> unless the author explicitly specifies the SET
> standard_conforming_strings clause in the function declaration.  I'm
> betting that most people writing and using plpgsql functions don't
> know that.  Any thoughts about what can or should be done about that?

Isn't this exactly the same problem that application authors have been
facing with SQL in their code?

Namely, if there's a backslash anywhere in a string literal you
*cannot* leave it as a bare single-quoted string literal.  You need to
decide whether you want the backslash treated as an escape character
(and therefore use E quoting), or as a backslash (and therefore use $$
quoting).

Until you've done that for every single string literal with a
backslash, your application isn't ready for
standard_conforming_strings to be switched on.

I agree that there are probably a great many app authors out there who
don't realise how very boned they might be if the default GUC gets
changed and they haven't prepared their SQL to cope.

Cheers,
BJ


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Bruce Momjian
Date:
Brendan Jurd wrote:
> On Sat, Apr 11, 2009 at 4:40 AM, Kevin Grittner
> <Kevin.Grittner@wicourts.gov> wrote:
> > The aspect of 8.3 behavior that concerns me most is that neither the
> > author of a function, nor anyone using it, can control or predict
> > which way a string literal with a backslash will be interpreted,
> > unless the author explicitly specifies the SET
> > standard_conforming_strings clause in the function declaration. ?I'm
> > betting that most people writing and using plpgsql functions don't
> > know that. ?Any thoughts about what can or should be done about that?
> 
> Isn't this exactly the same problem that application authors have been
> facing with SQL in their code?
> 
> Namely, if there's a backslash anywhere in a string literal you
> *cannot* leave it as a bare single-quoted string literal.  You need to
> decide whether you want the backslash treated as an escape character
> (and therefore use E quoting), or as a backslash (and therefore use $$
> quoting).
> 
> Until you've done that for every single string literal with a
> backslash, your application isn't ready for
> standard_conforming_strings to be switched on.
> 
> I agree that there are probably a great many app authors out there who
> don't realise how very boned they might be if the default GUC gets
> changed and they haven't prepared their SQL to cope.

I assume those authors are getting warnings, which is something we don't
for PL/pgSQL now.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
"Kevin Grittner"
Date:
Tom Lane <tgl@sss.pgh.pa.us> wrote: 
> "Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
>> The aspect of 8.3 behavior that concerns me most is that neither
>> the author of a function, nor anyone using it, can control or
>> predict which way a string literal with a backslash will be
>> interpreted, unless the author explicitly specifies the SET
>> standard_conforming_strings clause in the function declaration.
> 
> Yeah.  This is one reason why I'm still afraid to flip the default
> value of standard_conforming_strings --- there seems too much risk
> of widespread breakage.
> 
> I don't have a good solution for it, but I agree it's a problem.
Now that I see that string literals are currently interpreted
inconsistently, I don't think there's any way to get to a sane
behavior without risking some breakage somewhere.  If, as I've seen
some people assert, most people aren't setting the
standard_conforming_strings = on, it would seem to be reasonable to
put the risk with that 'on' setting.
Let me ask this -- If we were to change the plpgsql parser to pay
attention to the GUC, it couldn't break anything for any environment
which always has the GUC 'off', could it?
If not, I am having a hard time seeing a smoother transition than to
change the plpgsql parser to use the GUC, and to have the CREATE
FUNCTION statement make a special case of defaulting this GUC to FROM
CURRENT.  Making an exception of this offends a little, but not as
badly as unpredictable runtime behavior.
An advantage of this approach is that it would be just another place
to check your string literals when and if you go to switch over to
standard literals.
Whether to ever change the default behavior over to the standard is
more of a "marketing" decision than a technical one, I think.
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Tom Lane
Date:
Bruce Momjian <bruce@momjian.us> writes:
> Brendan Jurd wrote:
>> I agree that there are probably a great many app authors out there who
>> don't realise how very boned they might be if the default GUC gets
>> changed and they haven't prepared their SQL to cope.

> I assume those authors are getting warnings, which is something we don't
> for PL/pgSQL now.

To the extent that the strings are getting passed through to the main
SQL engine, they do get warnings now, and pretty noisy ones:

regression=# create function foo2() returns text as $$
begin return 'foo\'s bar';
end$$ language plpgsql;
WARNING:  nonstandard use of \' in a string literal
LINE 1: SELECT  'foo\'s bar'               ^
HINT:  Use '' to write quotes in strings, or use the escape string syntax (E'...').
QUERY:  SELECT  'foo\'s bar'
CONTEXT:  SQL statement in PL/PgSQL function "foo2" near line 2
CREATE FUNCTION
regression=# select foo2();
WARNING:  nonstandard use of \' in a string literal
LINE 1: SELECT  'foo\'s bar'               ^
HINT:  Use '' to write quotes in strings, or use the escape string syntax (E'...').
QUERY:  SELECT  'foo\'s bar'
CONTEXT:  PL/pgSQL function "foo2" line 2 at RETURN  foo2    
-----------foo's bar
(1 row)

It's the corner cases where plpgsql doesn't pass strings through that
are worrisome.  It's possible that RAISE is the only such case ---
anyone want to check?

Actually, what this thread is leading me towards is the idea that almost
nobody really has standard_conforming_strings turned on in production
(except maybe with apps ported from Oracle or someplace else).  If they
did, we'd be seeing more complaints about plpgsql not working properly.
So maybe we *could* change plpgsql to honor the GUC without anyone
noticing too much.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Tom Lane
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> Let me ask this -- If we were to change the plpgsql parser to pay
> attention to the GUC, it couldn't break anything for any environment
> which always has the GUC 'off', could it?

Right, because the behavior wouldn't actually change.

I'm starting to lean in the same direction --- the current plpgsql
behavior with the GUC 'on' is sufficiently broken that it seems unlikely
anyone is doing much with plpgsql and that setting.

It still remains that actually flipping the default would probably
provoke lots of breakage, but plpgsql's current behavior doesn't
help that.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Bruce Momjian
Date:
Tom Lane wrote:
> "Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> > Let me ask this -- If we were to change the plpgsql parser to pay
> > attention to the GUC, it couldn't break anything for any environment
> > which always has the GUC 'off', could it?
> 
> Right, because the behavior wouldn't actually change.
> 
> I'm starting to lean in the same direction --- the current plpgsql
> behavior with the GUC 'on' is sufficiently broken that it seems unlikely
> anyone is doing much with plpgsql and that setting.
> 
> It still remains that actually flipping the default would probably
> provoke lots of breakage, but plpgsql's current behavior doesn't
> help that.

It would be nice to know if we are ever going to set
standard_conforming_strings to on.  If not, we can remove the TODO item.
The bigger question is if we aren't going to turn it on was there any
value to setting escape_string_warning to on in 8.2?  We required a lot
of users to prefix their strings with 'E'.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
"Kevin Grittner"
Date:
Bruce Momjian <bruce@momjian.us> wrote:
> It would be nice to know if we are ever going to set
> standard_conforming_strings to on.
My personal bias is to go to the standard behavior as the default at
some point.  For legacy reasons, I don't know that you would ever want
to remove the setting; especially since I don't think it adds much
code if you're going to support the E'...' literals.  The ugliest
thing about this GUC is that it adds some complications to the flex
code, but it doesn't seem that bad to me.
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
Bruce Momjian
Date:
Kevin Grittner wrote:
> Bruce Momjian <bruce@momjian.us> wrote:
> > It would be nice to know if we are ever going to set
> > standard_conforming_strings to on.
>  
> My personal bias is to go to the standard behavior as the default at
> some point.  For legacy reasons, I don't know that you would ever want
> to remove the setting; especially since I don't think it adds much
> code if you're going to support the E'...' literals.  The ugliest
> thing about this GUC is that it adds some complications to the flex
> code, but it doesn't seem that bad to me.

Agreed, we would probably never remove standard_conforming_strings.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
Tom Lane
Date:
Bruce Momjian <bruce@momjian.us> writes:
> Kevin Grittner wrote:
>> My personal bias is to go to the standard behavior as the default at
>> some point.  For legacy reasons, I don't know that you would ever want
>> to remove the setting; especially since I don't think it adds much
>> code if you're going to support the E'...' literals.  The ugliest
>> thing about this GUC is that it adds some complications to the flex
>> code, but it doesn't seem that bad to me.

> Agreed, we would probably never remove standard_conforming_strings.

Yeah, I don't see that happening either.  I agree with Kevin that it
would be nice to flip the default at some point, but I'm afraid it's a
long way off yet.

Back to the point at hand: do we want to look at making plpgsql respect
the GUC?  I think it's a bit trickier than it looks, because we don't
want duplicate warnings from both plpgsql and the main parser for
strings that get fed through.  I'm inclined to deal with the special
case (RAISE and anything else similar) by changing the code so that we
*do* feed the string literal through the main parser, not for any
functional effect but just to have it throw the right warnings/errors.
Otherwise the plpgsql lexer has to somehow know when to warn and when
not, which'd be a mess.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
"Kevin Grittner"
Date:
Tom Lane <tgl@sss.pgh.pa.us> wrote: 
> do we want to look at making plpgsql respect the GUC?
+1
> I'm inclined to deal with the special case (RAISE and anything else
> similar) by changing the code so that we *do* feed the string
> literal through the main parser, not for any functional effect but
> just to have it throw the right warnings/errors.
+1
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escaping notdisabled inplpgsql

From
Josh Berkus
Date:
Tom,

> Actually, what this thread is leading me towards is the idea that almost
> nobody really has standard_conforming_strings turned on in production
> (except maybe with apps ported from Oracle or someplace else).  If they
> did, we'd be seeing more complaints about plpgsql not working properly.
> So maybe we *could* change plpgsql to honor the GUC without anyone
> noticing too much.

Actually, a lot of people are using $escapes$ for all nested quotes in 
plpgsql.  So they wouldn't notice the problem.

-- 
Josh Berkus
PostgreSQL Experts Inc.
www.pgexperts.com


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
Andrew Gierth
Date:
>>>>> "Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:
Tom> Back to the point at hand: do we want to look at making plpgsqlTom> respect the GUC?

Surely what matters is the value of the GUC at the time that you did
the CREATE FUNCTION, not the value at the time you happen to be
calling it?

-- 
Andrew (irc:RhodiumToad)


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabledinplpgsql

From
"Kevin Grittner"
Date:
Andrew Gierth <andrew@tao11.riddles.org.uk> wrote: 
> Surely what matters is the value of the GUC at the time that you did
> the CREATE FUNCTION, not the value at the time you happen to be
> calling it?
Well, that's a change I'm arguing for.  That would require both the
plpgsql parser change Tom is talking about, and a change to CREATE
FUNCTION such that there is an implied SET standard_compliant_strings
FROM CURRENT -- which is something I've suggested a couple times;
there's been no explicit response to that.
See back here in the thread for some behavior which surprised me:
http://archives.postgresql.org/pgsql-hackers/2009-04/msg00519.php
-Kevin


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabled inplpgsql

From
Tom Lane
Date:
Andrew Gierth <andrew@tao11.riddles.org.uk> writes:
> "Tom" == Tom Lane <tgl@sss.pgh.pa.us> writes:
>  Tom> Back to the point at hand: do we want to look at making plpgsql
>  Tom> respect the GUC?

> Surely what matters is the value of the GUC at the time that you did
> the CREATE FUNCTION, not the value at the time you happen to be
> calling it?

No, it isn't, and that's not the immediate problem anyway --- the
immediate problem is that plpgsql doesn't respect *any* value of
the GUC.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabledinplpgsql

From
Tom Lane
Date:
"Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
> Well, that's a change I'm arguing for.  That would require both the
> plpgsql parser change Tom is talking about, and a change to CREATE
> FUNCTION such that there is an implied SET standard_compliant_strings
> FROM CURRENT -- which is something I've suggested a couple times;
> there's been no explicit response to that.

If you want one: it seems like a really bad idea.  Aside from the sheer
ugliness of special-casing one particular GUC, it would break existing
pg_dump files, since pg_dump has no idea that its setting of
standard_conforming_strings might influence the behavior of functions
it defines.

I don't actually see that standard_conforming_strings is worse than
search_path or half a dozen other settings that will influence the
semantics of SQL queries.  If anything it's less bad than those since
it's less likely to break things silently.  The whole topic just
illustrates that "invent a GUC" is not a pain-free solution to handling
definitional conflicts.
        regards, tom lane


Re: Re: [BUGS] BUG #4027: backslash escapingnotdisabledinplpgsql

From
"Kevin Grittner"
Date:
Tom Lane <tgl@sss.pgh.pa.us> wrote: 
> "Kevin Grittner" <Kevin.Grittner@wicourts.gov> writes:
>> a change to CREATE FUNCTION such that there is an implied SET
>> standard_compliant_strings FROM CURRENT
Hopefully obvious, I meant standard_conforming_strings.
> it seems like a really bad idea.
Then perhaps a note in the PL/pgSQL docs about the importance of
specifying that clause if the function contains any character string
literals which include a backslash?  Such a note should probably point
out that without this clause, the runtime value of any such literal
will be dependent on the value of standard_conforming_strings when the
plan is generated.
I think that many will find that behavior surprising; so if it's not
feasible to change it, we should at least document it.
-Kevin