diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 9e80fd9..7823b6a 100644
*** a/src/backend/commands/proclang.c
--- b/src/backend/commands/proclang.c
*************** CreateProceduralLanguage(CreatePLangStmt
*** 71,87 ****
  				valOid;
  	Oid			funcrettype;
  	Oid			funcargtypes[1];
  
  	/*
! 	 * Translate the language name and check that this language doesn't
! 	 * already exist
  	 */
  	languageName = case_translate_language_name(stmt->plname);
  
! 	if (SearchSysCacheExists1(LANGNAME, PointerGetDatum(languageName)))
! 		ereport(ERROR,
! 				(errcode(ERRCODE_DUPLICATE_OBJECT),
! 				 errmsg("language \"%s\" already exists", languageName)));
  
  	/*
  	 * If we have template information for the language, ignore the supplied
--- 71,85 ----
  				valOid;
  	Oid			funcrettype;
  	Oid			funcargtypes[1];
+ 	bool		langExists;
  
  	/*
! 	 * Translate the language name and see if this language already
! 	 * exists
  	 */
  	languageName = case_translate_language_name(stmt->plname);
  
! 	langExists = SearchSysCacheExists1(LANGNAME, PointerGetDatum(languageName));
  
  	/*
  	 * If we have template information for the language, ignore the supplied
*************** CreateProceduralLanguage(CreatePLangStmt
*** 92,97 ****
--- 90,105 ----
  		List	   *funcname;
  
  		/*
+ 		 * Check if language already exists; if it did, since this is
+ 		 * a template language, issue a NOTICE instead of an ERROR.
+ 		 */
+ 		if (langExists) {
+ 			ereport(NOTICE,
+ 					(errmsg("skipping identical CREATE LANGUAGE definition")));
+ 			return;
+ 		}
+ 
+ 		/*
  		 * Give a notice if we are ignoring supplied parameters.
  		 */
  		if (stmt->plhandler)
*************** CreateProceduralLanguage(CreatePLangStmt
*** 237,242 ****
--- 245,258 ----
  	}
  	else
  	{
+ 		/* No template, and the language already existed, so we'll bail */
+ 
+ 		if (langExists) 
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_DUPLICATE_OBJECT),
+ 					 errmsg("language \"%s\" already exists", languageName)));
+ 
+ 
  		/*
  		 * No template, so use the provided information.  If there's no
  		 * handler clause, the user is trying to rely on a template that we
