Thread

  1. setting per-database/role parameters checks them against wrong context

    Peter Eisentraut <peter_e@gmx.net> — 2012-09-28T03:29:44Z

    Example:
    
    create temporary table foo (a int);
    insert into foo values (1);
    alter role peter set temp_buffers = 120;
    ERROR:  22023: invalid value for parameter "temp_buffers": 120
    DETAIL:  "temp_buffers" cannot be changed after any temporary tables
    have been accessed in the session.
    
    Another example:
    
    set log_statement_stats = on;
    alter role peter set log_parser_stats = on;
    ERROR:  22023: invalid value for parameter "log_parser_stats": 1
    DETAIL:  Cannot enable parameter when "log_statement_stats" is true.
    
    Another example is that in <=9.1, ALTER DATABASE ... SET search_path
    would check the existence of the schema in the current database, but
    that was done away with in 9.2.
    
    The first example could probably be fixed if check_temp_buffers() paid
    attention to the GucSource, but in the second case and in general there
    doesn't seem to be a way to distinguish "assigning per-database setting"
    and "enacting per-database setting" as a source.
    
    Ideas?
    
    
    
    
    
  2. Re: setting per-database/role parameters checks them against wrong context

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-09-28T14:10:34Z

    Peter Eisentraut <peter_e@gmx.net> writes:
    > Example:
    > create temporary table foo (a int);
    > insert into foo values (1);
    > alter role peter set temp_buffers = 120;
    > ERROR:  22023: invalid value for parameter "temp_buffers": 120
    > DETAIL:  "temp_buffers" cannot be changed after any temporary tables
    > have been accessed in the session.
    
    > Another example:
    
    > set log_statement_stats = on;
    > alter role peter set log_parser_stats = on;
    > ERROR:  22023: invalid value for parameter "log_parser_stats": 1
    > DETAIL:  Cannot enable parameter when "log_statement_stats" is true.
    
    > Another example is that in <=9.1, ALTER DATABASE ... SET search_path
    > would check the existence of the schema in the current database, but
    > that was done away with in 9.2.
    
    > The first example could probably be fixed if check_temp_buffers() paid
    > attention to the GucSource, but in the second case and in general there
    > doesn't seem to be a way to distinguish "assigning per-database setting"
    > and "enacting per-database setting" as a source.
    
    > Ideas?
    
    Perhaps instead of trying to solve the problem as stated, it would be
    more useful to put the effort into getting rid of context-sensitive
    restrictions on GUC settings.  Neither of the examples above seem
    particularly essential - they are just protecting incomplete
    implementations.
    
    			regards, tom lane
    
    
    
  3. Re: setting per-database/role parameters checks them against wrong context

    Selena Deckelmann <selena@chesnok.com> — 2012-10-01T19:37:19Z

    On Fri, Sep 28, 2012 at 7:10 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Peter Eisentraut <peter_e@gmx.net> writes:
    >> Example:
    >> create temporary table foo (a int);
    >> insert into foo values (1);
    >> alter role peter set temp_buffers = 120;
    >> ERROR:  22023: invalid value for parameter "temp_buffers": 120
    >> DETAIL:  "temp_buffers" cannot be changed after any temporary tables
    >> have been accessed in the session.
    >
    >> Another example:
    >
    >> set log_statement_stats = on;
    >> alter role peter set log_parser_stats = on;
    >> ERROR:  22023: invalid value for parameter "log_parser_stats": 1
    >> DETAIL:  Cannot enable parameter when "log_statement_stats" is true.
    >
    >> Another example is that in <=9.1, ALTER DATABASE ... SET search_path
    >> would check the existence of the schema in the current database, but
    >> that was done away with in 9.2.
    >
    >> The first example could probably be fixed if check_temp_buffers() paid
    >> attention to the GucSource, but in the second case and in general there
    >> doesn't seem to be a way to distinguish "assigning per-database setting"
    >> and "enacting per-database setting" as a source.
    >
    >> Ideas?
    >
    > Perhaps instead of trying to solve the problem as stated, it would be
    > more useful to put the effort into getting rid of context-sensitive
    > restrictions on GUC settings.  Neither of the examples above seem
    > particularly essential - they are just protecting incomplete
    > implementations.
    
    The check_temp_buffers() problem seems like a regression and blocks us
    from upgrading to 9.2. The use case are functions that set
    temp_buffers and occasionally are called in a series from a parent
    session.  The work around is... a lot of work.
    
    I'd appreciate it if we could fix the temp_buffers issue, and I
    support getting rid of context-sensitive restrictions. :)
    
    -selena
    
    -- 
    http://chesnok.com
    
    
    
  4. Re: setting per-database/role parameters checks them against wrong context

    Tom Lane <tgl@sss.pgh.pa.us> — 2012-10-01T20:00:59Z

    Selena Deckelmann <selena@chesnok.com> writes:
    > The check_temp_buffers() problem seems like a regression and blocks us
    > from upgrading to 9.2. The use case are functions that set
    > temp_buffers and occasionally are called in a series from a parent
    > session.  The work around is... a lot of work.
    
    Uh ... how is that a regression?  AFAIK it's been that way right along.
    
    			regards, tom lane
    
    
    
  5. Re: setting per-database/role parameters checks them against wrong context

    Josh Berkus <josh@agliodbs.com> — 2012-10-01T20:04:54Z

    > Uh ... how is that a regression?  AFAIK it's been that way right along.
    
    No, it hasn't.  I currently have an application whose functions, each of
    which sets temp_buffers, works fine under 9.0 and ERRORs out under 9.2.
     It's blocking an upgrade.
    
    This is new.
    
    -- 
    Josh Berkus
    PostgreSQL Experts Inc.
    http://pgexperts.com
    
    
    
  6. Re: setting per-database/role parameters checks them against wrong context

    Selena Deckelmann <selena@chesnok.com> — 2012-10-01T20:37:11Z

    On Mon, Oct 1, 2012 at 1:00 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > Selena Deckelmann <selena@chesnok.com> writes:
    >> The check_temp_buffers() problem seems like a regression and blocks us
    >> from upgrading to 9.2. The use case are functions that set
    >> temp_buffers and occasionally are called in a series from a parent
    >> session.  The work around is... a lot of work.
    >
    > Uh ... how is that a regression?  AFAIK it's been that way right along.
    
    We're running 9.0 - looks like it changed in 9.1, last revision to the
    relevant line was 6/2011. The group decided not to upgrade to 9.1 last
    year, but was going to just go directly to 9.2 in the next few weeks.
    
    -selena
    
    -- 
    http://chesnok.com
    
    
    
  7. Re: setting per-database/role parameters checks them against wrong context

    Selena Deckelmann <selena@chesnok.com> — 2012-10-01T21:28:45Z

    On Mon, Oct 1, 2012 at 1:37 PM, Selena Deckelmann <selena@chesnok.com> wrote:
    > On Mon, Oct 1, 2012 at 1:00 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >> Selena Deckelmann <selena@chesnok.com> writes:
    >>> The check_temp_buffers() problem seems like a regression and blocks us
    >>> from upgrading to 9.2. The use case are functions that set
    >>> temp_buffers and occasionally are called in a series from a parent
    >>> session.  The work around is... a lot of work.
    >>
    >> Uh ... how is that a regression?  AFAIK it's been that way right along.
    >
    > We're running 9.0 - looks like it changed in 9.1, last revision to the
    > relevant line was 6/2011. The group decided not to upgrade to 9.1 last
    > year, but was going to just go directly to 9.2 in the next few weeks.
    
    And, I was basing the regression comment on the documentation for
    temp_buffers: "The setting can be changed within individual sessions,
    but only before the first use of temporary tables within the session;
    subsequent attempts to change the value will have no effect on that
    session." This statement has been there since at least 8.1.
    
    A warning, and then not failing seems more appropriate than an error,
    given the documented behavior.
    
    -selena
    
    -- 
    http://chesnok.com
    
    
    
  8. Re: setting per-database/role parameters checks them against wrong context

    Selena Deckelmann <selena@chesnok.com> — 2012-10-06T21:20:53Z

    On Mon, Oct 1, 2012 at 2:28 PM, Selena Deckelmann <selena@chesnok.com> wrote:
    > On Mon, Oct 1, 2012 at 1:37 PM, Selena Deckelmann <selena@chesnok.com> wrote:
    >> On Mon, Oct 1, 2012 at 1:00 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    >>> Selena Deckelmann <selena@chesnok.com> writes:
    >>>> The check_temp_buffers() problem seems like a regression and blocks us
    >>>> from upgrading to 9.2. The use case are functions that set
    >>>> temp_buffers and occasionally are called in a series from a parent
    >>>> session.  The work around is... a lot of work.
    >>>
    >>> Uh ... how is that a regression?  AFAIK it's been that way right along.
    >>
    >> We're running 9.0 - looks like it changed in 9.1, last revision to the
    >> relevant line was 6/2011. The group decided not to upgrade to 9.1 last
    >> year, but was going to just go directly to 9.2 in the next few weeks.
    >
    > And, I was basing the regression comment on the documentation for
    > temp_buffers: "The setting can be changed within individual sessions,
    > but only before the first use of temporary tables within the session;
    > subsequent attempts to change the value will have no effect on that
    > session." This statement has been there since at least 8.1.
    >
    > A warning, and then not failing seems more appropriate than an error,
    > given the documented behavior.
    
    I tried out a few things, and then realized that perhaps just adding
    PGC_S_SESSION to the list of sources that are at elevel WARNING
    partially fixes this.
    
    This doesn't fix the issue with log_statement_stats, but it makes the
    behavior of temp_buffers  the documented behavior (no longer errors
    out in a transaction), while still warning the user.
    
    -selena
    
    
    -- 
    http://chesnok.com
    
  9. Re: setting per-database/role parameters checks them against wrong context

    Bruce Momjian <bruce@momjian.us> — 2013-01-25T19:44:25Z

    On Sat, Oct  6, 2012 at 02:20:53PM -0700, Selena Deckelmann wrote:
    > On Mon, Oct 1, 2012 at 2:28 PM, Selena Deckelmann <selena@chesnok.com> wrote:
    > > On Mon, Oct 1, 2012 at 1:37 PM, Selena Deckelmann <selena@chesnok.com> wrote:
    > >> On Mon, Oct 1, 2012 at 1:00 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
    > >>> Selena Deckelmann <selena@chesnok.com> writes:
    > >>>> The check_temp_buffers() problem seems like a regression and blocks us
    > >>>> from upgrading to 9.2. The use case are functions that set
    > >>>> temp_buffers and occasionally are called in a series from a parent
    > >>>> session.  The work around is... a lot of work.
    > >>>
    > >>> Uh ... how is that a regression?  AFAIK it's been that way right along.
    > >>
    > >> We're running 9.0 - looks like it changed in 9.1, last revision to the
    > >> relevant line was 6/2011. The group decided not to upgrade to 9.1 last
    > >> year, but was going to just go directly to 9.2 in the next few weeks.
    > >
    > > And, I was basing the regression comment on the documentation for
    > > temp_buffers: "The setting can be changed within individual sessions,
    > > but only before the first use of temporary tables within the session;
    > > subsequent attempts to change the value will have no effect on that
    > > session." This statement has been there since at least 8.1.
    > >
    > > A warning, and then not failing seems more appropriate than an error,
    > > given the documented behavior.
    > 
    > I tried out a few things, and then realized that perhaps just adding
    > PGC_S_SESSION to the list of sources that are at elevel WARNING
    > partially fixes this.
    > 
    > This doesn't fix the issue with log_statement_stats, but it makes the
    > behavior of temp_buffers  the documented behavior (no longer errors
    > out in a transaction), while still warning the user.
    
    > diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
    > index 6b202e0..0677059 100644
    > --- a/src/backend/utils/misc/guc.c
    > +++ b/src/backend/utils/misc/guc.c
    > @@ -5150,7 +5150,7 @@ set_config_option(const char *name, const char *value,
    >  			elevel = IsUnderPostmaster ? DEBUG3 : LOG;
    >  		}
    >  		else if (source == PGC_S_DATABASE || source == PGC_S_USER ||
    > -				 source == PGC_S_DATABASE_USER)
    > +				 source == PGC_S_DATABASE_USER || source == PG_S_SESSION)
    >  			elevel = WARNING;
    >  		else
    >  			elevel = ERROR;
    
    Is there any opinion on whether we need this patch?  It basically allows
    SET from a session to issue a warning rather than an error.  This is
    certainly a much larger change than just fixing temp_buffers.  The user
    complaint was that functions were setting temp_buffers and getting
    errors because temp table has already been used:
    
            The setting can be changed within individual sessions, but only
            before the first use of temporary tables within the session;
            subsequent attempts to change the value will have no effect on
            that session.
    
    The full thread is here:
    
    	http://www.postgresql.org/message-id/1348802984.3584.22.camel@vanquo.pezone.net
    
    Seems this changed in PG 9.1.
    
    -- 
      Bruce Momjian  <bruce@momjian.us>        http://momjian.us
      EnterpriseDB                             http://enterprisedb.com
    
      + It's impossible for everything to be true. +
    
    
    
  10. Re: setting per-database/role parameters checks them against wrong context

    Tom Lane <tgl@sss.pgh.pa.us> — 2013-01-25T20:35:59Z

    Bruce Momjian <bruce@momjian.us> writes:
    >> diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
    >> index 6b202e0..0677059 100644
    >> --- a/src/backend/utils/misc/guc.c
    >> +++ b/src/backend/utils/misc/guc.c
    >> @@ -5150,7 +5150,7 @@ set_config_option(const char *name, const char *value,
    >> elevel = IsUnderPostmaster ? DEBUG3 : LOG;
    >> }
    >> else if (source == PGC_S_DATABASE || source == PGC_S_USER ||
    >> -				 source == PGC_S_DATABASE_USER)
    >> +				 source == PGC_S_DATABASE_USER || source == PG_S_SESSION)
    >> elevel = WARNING;
    >> else
    >> elevel = ERROR;
    
    > Is there any opinion on whether we need this patch?  It basically allows
    > SET from a session to issue a warning rather than an error.
    
    Surely this is a completely horrid idea.  It doesn't "allow" SET to
    throw a warning, it changes all interactive-SET cases from ERROR to
    WARNING.  That's a whole lot of collateral damage to fix a very narrow
    case that's not even there anymore.
    
    			regards, tom lane
    
    
    
  11. Re: setting per-database/role parameters checks them against wrong context

    Bruce Momjian <bruce@momjian.us> — 2013-01-25T20:40:57Z

    On Fri, Jan 25, 2013 at 03:35:59PM -0500, Tom Lane wrote:
    > Bruce Momjian <bruce@momjian.us> writes:
    > >> diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
    > >> index 6b202e0..0677059 100644
    > >> --- a/src/backend/utils/misc/guc.c
    > >> +++ b/src/backend/utils/misc/guc.c
    > >> @@ -5150,7 +5150,7 @@ set_config_option(const char *name, const char *value,
    > >> elevel = IsUnderPostmaster ? DEBUG3 : LOG;
    > >> }
    > >> else if (source == PGC_S_DATABASE || source == PGC_S_USER ||
    > >> -				 source == PGC_S_DATABASE_USER)
    > >> +				 source == PGC_S_DATABASE_USER || source == PG_S_SESSION)
    > >> elevel = WARNING;
    > >> else
    > >> elevel = ERROR;
    > 
    > > Is there any opinion on whether we need this patch?  It basically allows
    > > SET from a session to issue a warning rather than an error.
    > 
    > Surely this is a completely horrid idea.  It doesn't "allow" SET to
    > throw a warning, it changes all interactive-SET cases from ERROR to
    > WARNING.  That's a whole lot of collateral damage to fix a very narrow
    > case that's not even there anymore.
    
    Agreed.
    
    -- 
      Bruce Momjian  <bruce@momjian.us>        http://momjian.us
      EnterpriseDB                             http://enterprisedb.com
    
      + It's impossible for everything to be true. +