Reported by:

mike@ibm4.carb.nist.gov

Date:

Wed, 24 May 1995 15:48:20 -0400 (EDT)

Description

Query sent to backend is " CREATE TYPE MolWgt (input = array_in, output = array_out, internallength = variable);" WARN:May 24 15:39:10:Define: "internallength" = what?

Who can tell me where the problem is?

Fix

Apply this patch.

The patch below lets you specify "variable" as the internallength in CREATE TYPE. We also lied about precedence and associativity in CREATE OPERATOR. That has never been implemented. The patch below warns you when you try to specify either of them.

---------------------------------------------------------------------
*** src/backend/commands/define.c	Fri Mar 17 12:25:33 1995
--- src/backend/commands/define.c	Thu May 25 00:11:01 1995
***************
*** 58,63 ****
--- 58,64 ----
  static Name defGetName(DefElem *def);
  static char *defGetString(DefElem *def);
  static int  defGetInteger(DefElem *def);
+ static int  defGetTypeLength(DefElem *def);
  
  #define	DEFAULT_TYPDELIM	','
  
***************
*** 300,325 ****
  	} else if (!strcasecmp(defel->defname, "procedure")) {
  	    functionName = defGetName(defel);
  	} else if (!strcasecmp(defel->defname, "precedence")) {
! 	    precedence = defGetInteger(defel);
  	} else if (!strcasecmp(defel->defname, "associativity")) {
! 	    /* ----------------
! 	     * handle "[ associativity = (left|right|none|any) ]"
! 	     *	
! 	     * XXX Associativity code below must be fixed when the catalogs and
! 	     * XXX the planner/executor support proper associativity semantics.
! 	     * ----------------
! 	     */
! 	    String string = defGetString(defel);
! 	
! 	    if (!strcmp(string, "right")) {
! 		isLeftAssociative = false;
! 	    } else if (strcmp(string, "left") &&
! 		       strcmp(string, "none") &&
! 		       strcmp(string, "any")) {
! 		elog(WARN, "Define: precedence = what?");
! 	    } else {
! 		isLeftAssociative = true;
! 	    }
  	} else if (!strcasecmp(defel->defname, "commutator")) {
  	    commutatorName = defGetName(defel);
  	} else if (!strcasecmp(defel->defname, "negator")) {
--- 301,311 ----
  	} else if (!strcasecmp(defel->defname, "procedure")) {
  	    functionName = defGetName(defel);
  	} else if (!strcasecmp(defel->defname, "precedence")) {
! 	    /* NOT IMPLEMENTED (never worked in v4.2) */
! 	    elog(NOTICE, "CREATE OPERATOR: precedence not implemented");
  	} else if (!strcasecmp(defel->defname, "associativity")) {
! 	    /* NOT IMPLEMENTED (never worked in v4.2) */
! 	    elog(NOTICE, "CREATE OPERATOR: associativity not implemented");
  	} else if (!strcasecmp(defel->defname, "commutator")) {
  	    commutatorName = defGetName(defel);
  	} else if (!strcasecmp(defel->defname, "negator")) {
***************
*** 519,527 ****
  	DefElem *defel = (DefElem*)lfirst(pl);
  
  	if (!strcasecmp(defel->defname, "internallength")) {
! 	    internalLength = defGetInteger(defel);
  	}else if (!strcasecmp(defel->defname, "externallength")) {
! 	    externalLength = defGetInteger(defel);
  	}else if (!strcasecmp(defel->defname, "input")) {
  	    inputName = defGetName(defel);
  	}else if (!strcasecmp(defel->defname, "output")) {
--- 505,513 ----
  	DefElem *defel = (DefElem*)lfirst(pl);
  
  	if (!strcasecmp(defel->defname, "internallength")) {
! 	    internalLength = defGetTypeLength(defel);
  	}else if (!strcasecmp(defel->defname, "externallength")) {
! 	    externalLength = defGetTypeLength(defel);
  	}else if (!strcasecmp(defel->defname, "input")) {
  	    inputName = defGetName(defel);
  	}else if (!strcasecmp(defel->defname, "output")) {
***************
*** 642,645 ****
--- 628,643 ----
      if (nodeTag(def->arg)!=T_Integer)
  	elog(WARN, "Define: \"%s\" = what?", def->defname);
      return (intVal(def->arg));
+ }
+ 
+ static int 
+ defGetTypeLength(DefElem *def)
+ {
+     if (nodeTag(def->arg)==T_Integer)
+ 	return (intVal(def->arg));
+     else if (nodeTag(def->arg)==T_String &&
+ 	     !strcasecmp(strVal(def->arg),"variable"))
+ 	return -1;	/* variable length */
+     else
+ 	elog(WARN, "Define: \"%s\" = what?", def->defname);
  }