mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	DefineCollation() code cleanup
Reorganize the code in DefineCollation() so that the parts using the FROM clause and the parts not doing so are more cleanly separated. No functionality change intended. Reviewed-by: Julien Rouhaud <rjuju123@gmail.com> Discussion: https://www.postgresql.org/message-id/29ae752f-80e9-8d31-601c-62cf01cc93d8@enterprisedb.com
This commit is contained in:
		@@ -63,12 +63,11 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
 | 
			
		||||
	DefElem    *providerEl = NULL;
 | 
			
		||||
	DefElem    *deterministicEl = NULL;
 | 
			
		||||
	DefElem    *versionEl = NULL;
 | 
			
		||||
	char	   *collcollate = NULL;
 | 
			
		||||
	char	   *collctype = NULL;
 | 
			
		||||
	char	   *collproviderstr = NULL;
 | 
			
		||||
	bool		collisdeterministic = true;
 | 
			
		||||
	int			collencoding = 0;
 | 
			
		||||
	char		collprovider = 0;
 | 
			
		||||
	char	   *collcollate;
 | 
			
		||||
	char	   *collctype;
 | 
			
		||||
	bool		collisdeterministic;
 | 
			
		||||
	int			collencoding;
 | 
			
		||||
	char		collprovider;
 | 
			
		||||
	char	   *collversion = NULL;
 | 
			
		||||
	Oid			newoid;
 | 
			
		||||
	ObjectAddress address;
 | 
			
		||||
@@ -167,65 +166,71 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
 | 
			
		||||
					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 | 
			
		||||
					 errmsg("collation \"default\" cannot be copied")));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (localeEl)
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		collcollate = defGetString(localeEl);
 | 
			
		||||
		collctype = defGetString(localeEl);
 | 
			
		||||
	}
 | 
			
		||||
		char	   *collproviderstr = NULL;
 | 
			
		||||
 | 
			
		||||
	if (lccollateEl)
 | 
			
		||||
		collcollate = defGetString(lccollateEl);
 | 
			
		||||
		collcollate = NULL;
 | 
			
		||||
		collctype = NULL;
 | 
			
		||||
 | 
			
		||||
	if (lcctypeEl)
 | 
			
		||||
		collctype = defGetString(lcctypeEl);
 | 
			
		||||
		if (localeEl)
 | 
			
		||||
		{
 | 
			
		||||
			collcollate = defGetString(localeEl);
 | 
			
		||||
			collctype = defGetString(localeEl);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	if (providerEl)
 | 
			
		||||
		collproviderstr = defGetString(providerEl);
 | 
			
		||||
		if (lccollateEl)
 | 
			
		||||
			collcollate = defGetString(lccollateEl);
 | 
			
		||||
 | 
			
		||||
	if (deterministicEl)
 | 
			
		||||
		collisdeterministic = defGetBoolean(deterministicEl);
 | 
			
		||||
		if (lcctypeEl)
 | 
			
		||||
			collctype = defGetString(lcctypeEl);
 | 
			
		||||
 | 
			
		||||
	if (versionEl)
 | 
			
		||||
		collversion = defGetString(versionEl);
 | 
			
		||||
		if (providerEl)
 | 
			
		||||
			collproviderstr = defGetString(providerEl);
 | 
			
		||||
 | 
			
		||||
	if (collproviderstr)
 | 
			
		||||
	{
 | 
			
		||||
		if (pg_strcasecmp(collproviderstr, "icu") == 0)
 | 
			
		||||
			collprovider = COLLPROVIDER_ICU;
 | 
			
		||||
		else if (pg_strcasecmp(collproviderstr, "libc") == 0)
 | 
			
		||||
			collprovider = COLLPROVIDER_LIBC;
 | 
			
		||||
		if (deterministicEl)
 | 
			
		||||
			collisdeterministic = defGetBoolean(deterministicEl);
 | 
			
		||||
		else
 | 
			
		||||
			collisdeterministic = true;
 | 
			
		||||
 | 
			
		||||
		if (versionEl)
 | 
			
		||||
			collversion = defGetString(versionEl);
 | 
			
		||||
 | 
			
		||||
		if (collproviderstr)
 | 
			
		||||
		{
 | 
			
		||||
			if (pg_strcasecmp(collproviderstr, "icu") == 0)
 | 
			
		||||
				collprovider = COLLPROVIDER_ICU;
 | 
			
		||||
			else if (pg_strcasecmp(collproviderstr, "libc") == 0)
 | 
			
		||||
				collprovider = COLLPROVIDER_LIBC;
 | 
			
		||||
			else
 | 
			
		||||
				ereport(ERROR,
 | 
			
		||||
						(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 | 
			
		||||
						 errmsg("unrecognized collation provider: %s",
 | 
			
		||||
								collproviderstr)));
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
			collprovider = COLLPROVIDER_LIBC;
 | 
			
		||||
 | 
			
		||||
		if (!collcollate)
 | 
			
		||||
			ereport(ERROR,
 | 
			
		||||
					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 | 
			
		||||
					 errmsg("unrecognized collation provider: %s",
 | 
			
		||||
							collproviderstr)));
 | 
			
		||||
	}
 | 
			
		||||
	else if (!fromEl)
 | 
			
		||||
		collprovider = COLLPROVIDER_LIBC;
 | 
			
		||||
					 errmsg("parameter \"lc_collate\" must be specified")));
 | 
			
		||||
 | 
			
		||||
	if (!collcollate)
 | 
			
		||||
		ereport(ERROR,
 | 
			
		||||
				(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 | 
			
		||||
				 errmsg("parameter \"lc_collate\" must be specified")));
 | 
			
		||||
		if (!collctype)
 | 
			
		||||
			ereport(ERROR,
 | 
			
		||||
					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 | 
			
		||||
					 errmsg("parameter \"lc_ctype\" must be specified")));
 | 
			
		||||
 | 
			
		||||
	if (!collctype)
 | 
			
		||||
		ereport(ERROR,
 | 
			
		||||
				(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 | 
			
		||||
				 errmsg("parameter \"lc_ctype\" must be specified")));
 | 
			
		||||
		/*
 | 
			
		||||
		 * Nondeterministic collations are currently only supported with ICU
 | 
			
		||||
		 * because that's the only case where it can actually make a difference.
 | 
			
		||||
		 * So we can save writing the code for the other providers.
 | 
			
		||||
		 */
 | 
			
		||||
		if (!collisdeterministic && collprovider != COLLPROVIDER_ICU)
 | 
			
		||||
			ereport(ERROR,
 | 
			
		||||
					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 | 
			
		||||
					 errmsg("nondeterministic collations not supported with this provider")));
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Nondeterministic collations are currently only supported with ICU
 | 
			
		||||
	 * because that's the only case where it can actually make a difference.
 | 
			
		||||
	 * So we can save writing the code for the other providers.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!collisdeterministic && collprovider != COLLPROVIDER_ICU)
 | 
			
		||||
		ereport(ERROR,
 | 
			
		||||
				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 | 
			
		||||
				 errmsg("nondeterministic collations not supported with this provider")));
 | 
			
		||||
 | 
			
		||||
	if (!fromEl)
 | 
			
		||||
	{
 | 
			
		||||
		if (collprovider == COLLPROVIDER_ICU)
 | 
			
		||||
		{
 | 
			
		||||
#ifdef USE_ICU
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user