On Tue, Mar 13, 2007 at 08:22:17AM +0000, Gregory Stark wrote:
> The code seems to assume that all custom variables are strings. There are
> about half a dozen Assert(variable->vartype == PGC_STRING) throughout the
> patch. That's not true, plperl's use_strict is a boolean and we have
> DefineCustome*Variable functions for each type of variable. Perl bombs
> because plperl.use_strict is a boolean.

The attached patch removes those Asserts.

But this is not the whole story. I wonder why setting "plperl.use_strict"
is supposed to work at all? Where is the corresponding definition of
"plperl" as a custom variable class? I can add it manually to
postgresql.conf and make the regression tests work but is this the intended
way?


Joachim

Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/misc/guc.c,v
retrieving revision 1.380
diff -c -r1.380 guc.c
*** src/backend/utils/misc/guc.c	12 Mar 2007 22:09:28 -0000	1.380
--- src/backend/utils/misc/guc.c	13 Mar 2007 10:03:26 -0000
***************
*** 2658,2678 ****
  
  	gen = guc_variables[idx];
  
- 	/*
- 	 * Even though this function could delete other types of variables as well,
- 	 * at the moment we only call it for custom variables that always have type
- 	 * string.
- 	 */
  	Assert(gen->group == CUSTOM_OPTIONS);
- 	Assert(gen->vartype == PGC_STRING);
  
! 	conf = (struct config_string *) gen;
! 	set_string_field(conf, &conf->reset_val, NULL);
! 	set_string_field(conf, &conf->tentative_val, NULL);
! 	for (stack = conf->gen.stack; stack; stack = prev)
  	{
! 		set_string_field(conf, &stack->tentative_val.stringval, NULL);
! 		set_string_field(conf, &stack->value.stringval, NULL);
  		prev = stack->prev;
  		pfree(stack);
  	}
--- 2658,2678 ----
  
  	gen = guc_variables[idx];
  
  	Assert(gen->group == CUSTOM_OPTIONS);
  
! 	if (gen->vartype == PGC_STRING)
! 	{
! 		conf = (struct config_string *) gen;
! 		set_string_field(conf, &conf->reset_val, NULL);
! 		set_string_field(conf, &conf->tentative_val, NULL);
! 	}
! 	for (stack = gen->stack; stack; stack = prev)
  	{
! 		if (gen->vartype == PGC_STRING)
! 		{
! 			set_string_field(conf, &stack->tentative_val.stringval, NULL);
! 			set_string_field(conf, &stack->value.stringval, NULL);
! 		}
  		prev = stack->prev;
  		pfree(stack);
  	}
***************
*** 2698,2706 ****
  	gen = guc_variables[idx];
  
  	Assert(gen->group == CUSTOM_OPTIONS);
- 	Assert(gen->vartype == PGC_STRING);
- 
- 	conf = (struct config_string *) gen;
  
  	/*
  	 * Here we check whether it is safe to really delete the variable
--- 2698,2703 ----
***************
*** 2723,2731 ****
  		 * then been deleted from the configuration file should behave
  		 * as if it had been introduced in the session.
  		 */
- 		Assert(gen->vartype == PGC_STRING);
  		gen->reset_source = PGC_S_DEFAULT;
! 		set_string_field(conf, &conf->reset_val, NULL);
  	}
  	else
  		guc_delete_variable(name);
--- 2720,2731 ----
  		 * then been deleted from the configuration file should behave
  		 * as if it had been introduced in the session.
  		 */
  		gen->reset_source = PGC_S_DEFAULT;
! 		if (gen->vartype == PGC_STRING)
! 		{
! 			conf = (struct config_string *) gen;
! 			set_string_field(conf, &conf->reset_val, NULL);
! 		}
  	}
  	else
  		guc_delete_variable(name);
---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to