forbid-custom-pg-type-symbols.patch

application/octet-stream

Filename: forbid-custom-pg-type-symbols.patch
Type: application/octet-stream
Part: 0
Message: Re: duplicate function oid symbols

Patch

Format: unified
File+
src/backend/bootstrap/bootstrap.c 1 1
src/backend/catalog/genbki.pl 12 8
src/backend/commands/event_trigger.c 1 1
src/fe_utils/print.c 1 1
src/include/catalog/pg_type.dat 13 19
src/include/catalog/pg_type.h 7 0
src/interfaces/ecpg/ecpglib/execute.c 1 1
src/pl/plperl/plperl.c 2 2
src/pl/plpgsql/src/pl_comp.c 1 1
src/pl/plpgsql/src/pl_handler.c 1 1
src/pl/plpython/plpy_procedure.c 1 1
src/pl/tcl/pltcl.c 1 1
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 76b2f5066f..a7ed93fdc1 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -133,7 +133,7 @@ static const struct typinfo TypInfo[] = {
 	F_XIDIN, F_XIDOUT},
 	{"cid", CIDOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
 	F_CIDIN, F_CIDOUT},
-	{"pg_node_tree", PGNODETREEOID, 0, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, DEFAULT_COLLATION_OID,
+	{"pg_node_tree", PG_NODE_TREEOID, 0, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, DEFAULT_COLLATION_OID,
 	F_PG_NODE_TREE_IN, F_PG_NODE_TREE_OUT},
 	{"int2vector", INT2VECTOROID, INT2OID, -1, false, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
 	F_INT2VECTORIN, F_INT2VECTOROUT},
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 47b1a5d790..6516de5910 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -488,12 +488,6 @@ EOM
 	# Emit Natts_* constant
 	print $def "\n#define Natts_$catname $attnum\n\n";
 
-	# Emit client code copied from source header
-	foreach my $line (@{ $catalog->{client_code} })
-	{
-		print $def $line;
-	}
-
 	# Open it, unless it's a bootstrap catalog (create bootstrap does this
 	# automatically)
 	if (!$catalog->{bootstrap})
@@ -588,9 +582,13 @@ EOM
 		}
 
 		# Special hack to generate OID symbols for pg_type entries
-		# that lack one.
-		if ($catname eq 'pg_type' and !exists $bki_values{oid_symbol})
+		if ($catname eq 'pg_type')
 		{
+			die sprintf
+			  "custom OID symbols are not allowed for pg_type entries: '%s'",
+			  $bki_values{oid_symbol}
+			  if defined $bki_values{oid_symbol};
+
 			my $symbol = form_pg_type_symbol($bki_values{typname});
 			$bki_values{oid_symbol} = $symbol
 			  if defined $symbol;
@@ -614,6 +612,12 @@ EOM
 		}
 	}
 
+	# Emit client code copied from source header
+	foreach my $line (@{ $catalog->{client_code} })
+	{
+		print $def $line;
+	}
+
 	print $bki "close $catname\n";
 	printf $def "\n#endif\t\t\t\t\t\t\t/* %s_D_H */\n", uc $catname;
 
diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c
index 8bb17c34f5..3ffba4e63e 100644
--- a/src/backend/commands/event_trigger.c
+++ b/src/backend/commands/event_trigger.c
@@ -177,7 +177,7 @@ CreateEventTrigger(CreateEventTrigStmt *stmt)
 	/* Find and validate the trigger function. */
 	funcoid = LookupFuncName(stmt->funcname, 0, NULL, false);
 	funcrettype = get_func_rettype(funcoid);
-	if (funcrettype != EVTTRIGGEROID)
+	if (funcrettype != EVENT_TRIGGEROID)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 				 errmsg("function %s must return type %s",
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index 508f537c0c..d542792230 100644
--- a/src/fe_utils/print.c
+++ b/src/fe_utils/print.c
@@ -3495,7 +3495,7 @@ column_type_alignment(Oid ftype)
 		case XIDOID:
 		case XID8OID:
 		case CIDOID:
-		case CASHOID:
+		case MONEYOID:
 			align = 'r';
 			break;
 		default:
diff --git a/src/include/catalog/pg_type.dat b/src/include/catalog/pg_type.dat
index b2cec07416..7e499cd37d 100644
--- a/src/include/catalog/pg_type.dat
+++ b/src/include/catalog/pg_type.dat
@@ -15,14 +15,14 @@
 # For types used in the system catalogs, make sure the values here match
 # TypInfo[] in bootstrap.c.
 
-# OID symbol macro names for pg_type OIDs are generated by genbki.pl
-# according to the following rule, so you don't need to specify them
-# here:
+# OID symbol macro names for pg_type OIDs are not specified here because
+# they are generated by genbki.pl according to the following rule:
+#
 #  foo_bar  ->  FOO_BAROID
 # _foo_bar  ->  FOO_BARARRAYOID
 #
-# The only oid_symbol entries in this file are for names that don't match
-# this rule, and are grandfathered in.
+# Backward compatibilty macros for grandfathered symbol names are found
+# in pg_type.h.
 
 # To autogenerate an array type, add 'array_type_oid => 'nnnn' to the element
 # type, which will instruct genbki.pl to generate a BKI entry for it.
@@ -144,35 +144,30 @@
   typname => 'xml', typlen => '-1', typbyval => 'f', typcategory => 'U',
   typinput => 'xml_in', typoutput => 'xml_out', typreceive => 'xml_recv',
   typsend => 'xml_send', typalign => 'i', typstorage => 'x' },
-{ oid => '194', oid_symbol => 'PGNODETREEOID',
-  descr => 'string representing an internal node tree',
+{ oid => '194', descr => 'string representing an internal node tree',
   typname => 'pg_node_tree', typlen => '-1', typbyval => 'f',
   typcategory => 'S', typinput => 'pg_node_tree_in',
   typoutput => 'pg_node_tree_out', typreceive => 'pg_node_tree_recv',
   typsend => 'pg_node_tree_send', typalign => 'i', typstorage => 'x',
   typcollation => 'default' },
-{ oid => '3361', oid_symbol => 'PGNDISTINCTOID',
-  descr => 'multivariate ndistinct coefficients',
+{ oid => '3361', descr => 'multivariate ndistinct coefficients',
   typname => 'pg_ndistinct', typlen => '-1', typbyval => 'f',
   typcategory => 'S', typinput => 'pg_ndistinct_in',
   typoutput => 'pg_ndistinct_out', typreceive => 'pg_ndistinct_recv',
   typsend => 'pg_ndistinct_send', typalign => 'i', typstorage => 'x',
   typcollation => 'default' },
-{ oid => '3402', oid_symbol => 'PGDEPENDENCIESOID',
-  descr => 'multivariate dependencies',
+{ oid => '3402', descr => 'multivariate dependencies',
   typname => 'pg_dependencies', typlen => '-1', typbyval => 'f',
   typcategory => 'S', typinput => 'pg_dependencies_in',
   typoutput => 'pg_dependencies_out', typreceive => 'pg_dependencies_recv',
   typsend => 'pg_dependencies_send', typalign => 'i', typstorage => 'x',
   typcollation => 'default' },
-{ oid => '5017', oid_symbol => 'PGMCVLISTOID',
-  descr => 'multivariate MCV list',
+{ oid => '5017', descr => 'multivariate MCV list',
   typname => 'pg_mcv_list', typlen => '-1', typbyval => 'f', typcategory => 'S',
   typinput => 'pg_mcv_list_in', typoutput => 'pg_mcv_list_out',
   typreceive => 'pg_mcv_list_recv', typsend => 'pg_mcv_list_send',
   typalign => 'i', typstorage => 'x', typcollation => 'default' },
-{ oid => '32', oid_symbol => 'PGDDLCOMMANDOID',
-  descr => 'internal type for passing CollectedCommand',
+{ oid => '32', descr => 'internal type for passing CollectedCommand',
   typname => 'pg_ddl_command', typlen => 'SIZEOF_POINTER', typbyval => 't',
   typtype => 'p', typcategory => 'P', typinput => 'pg_ddl_command_in',
   typoutput => 'pg_ddl_command_out', typreceive => 'pg_ddl_command_recv',
@@ -237,7 +232,7 @@
   typname => 'circle', typlen => '24', typbyval => 'f', typcategory => 'G',
   typinput => 'circle_in', typoutput => 'circle_out',
   typreceive => 'circle_recv', typsend => 'circle_send', typalign => 'd' },
-{ oid => '790', oid_symbol => 'CASHOID', array_type_oid => '791',
+{ oid => '790', array_type_oid => '791',
   descr => 'monetary amounts, $d,ddd.cc',
   typname => 'money', typlen => '8', typbyval => 'FLOAT8PASSBYVAL',
   typcategory => 'N', typinput => 'cash_in', typoutput => 'cash_out',
@@ -409,8 +404,7 @@
   typsend => 'uuid_send', typalign => 'c' },
 
 # pg_lsn
-{ oid => '3220', oid_symbol => 'LSNOID', array_type_oid => '3221',
-  descr => 'PostgreSQL LSN datatype',
+{ oid => '3220', array_type_oid => '3221', descr => 'PostgreSQL LSN datatype',
   typname => 'pg_lsn', typlen => '8', typbyval => 'FLOAT8PASSBYVAL',
   typcategory => 'U', typinput => 'pg_lsn_in', typoutput => 'pg_lsn_out',
   typreceive => 'pg_lsn_recv', typsend => 'pg_lsn_send', typalign => 'd' },
@@ -542,7 +536,7 @@
   typname => 'trigger', typlen => '4', typbyval => 't', typtype => 'p',
   typcategory => 'P', typinput => 'trigger_in', typoutput => 'trigger_out',
   typreceive => '-', typsend => '-', typalign => 'i' },
-{ oid => '3838', oid_symbol => 'EVTTRIGGEROID',
+{ oid => '3838',
   descr => 'pseudo-type for the result of an event trigger function',
   typname => 'event_trigger', typlen => '4', typbyval => 't', typtype => 'p',
   typcategory => 'P', typinput => 'event_trigger_in',
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 7b37562648..8283ba2475 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -256,6 +256,13 @@ typedef FormData_pg_type *Form_pg_type;
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
+/*
+ * Backwards compatibility for ancient random spellings of OID macros.
+ * Don't use these macros in new code.
+ */
+#define CASHOID MONEYOID
+#define LSNOID PG_LSNOID
+
 /*
  * macros for values of poor-mans-enumerated-type columns
  */
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 9d61ae7250..930b6adbe4 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -230,7 +230,7 @@ ecpg_is_type_an_array(int type, const struct statement *stmt, const struct varia
 			return ECPG_ARRAY_ERROR;
 		if (!ecpg_type_infocache_push(&(stmt->connection->cache_head), CIRCLEOID, ECPG_ARRAY_NONE, stmt->lineno))
 			return ECPG_ARRAY_ERROR;
-		if (!ecpg_type_infocache_push(&(stmt->connection->cache_head), CASHOID, ECPG_ARRAY_NONE, stmt->lineno))
+		if (!ecpg_type_infocache_push(&(stmt->connection->cache_head), MONEYOID, ECPG_ARRAY_NONE, stmt->lineno))
 			return ECPG_ARRAY_ERROR;
 		if (!ecpg_type_infocache_push(&(stmt->connection->cache_head), INETOID, ECPG_ARRAY_NONE, stmt->lineno))
 			return ECPG_ARRAY_ERROR;
diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c
index 5fdf303fe6..7844c500ee 100644
--- a/src/pl/plperl/plperl.c
+++ b/src/pl/plperl/plperl.c
@@ -2002,7 +2002,7 @@ plperl_validator(PG_FUNCTION_ARGS)
 	{
 		if (proc->prorettype == TRIGGEROID)
 			is_trigger = true;
-		else if (proc->prorettype == EVTTRIGGEROID)
+		else if (proc->prorettype == EVENT_TRIGGEROID)
 			is_event_trigger = true;
 		else if (proc->prorettype != RECORDOID &&
 				 proc->prorettype != VOIDOID)
@@ -2838,7 +2838,7 @@ compile_plperl_function(Oid fn_oid, bool is_trigger, bool is_event_trigger)
 					rettype == RECORDOID)
 					 /* okay */ ;
 				else if (rettype == TRIGGEROID ||
-						 rettype == EVTTRIGGEROID)
+						 rettype == EVENT_TRIGGEROID)
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 							 errmsg("trigger functions can only be called "
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index 344627da95..6df8e14629 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -551,7 +551,7 @@ do_compile(FunctionCallInfo fcinfo,
 				if (rettypeid == VOIDOID ||
 					rettypeid == RECORDOID)
 					 /* okay */ ;
-				else if (rettypeid == TRIGGEROID || rettypeid == EVTTRIGGEROID)
+				else if (rettypeid == TRIGGEROID || rettypeid == EVENT_TRIGGEROID)
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 							 errmsg("trigger functions can only be called as triggers")));
diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c
index b13bd2be31..7ece87df48 100644
--- a/src/pl/plpgsql/src/pl_handler.c
+++ b/src/pl/plpgsql/src/pl_handler.c
@@ -445,7 +445,7 @@ plpgsql_validator(PG_FUNCTION_ARGS)
 	{
 		if (proc->prorettype == TRIGGEROID)
 			is_dml_trigger = true;
-		else if (proc->prorettype == EVTTRIGGEROID)
+		else if (proc->prorettype == EVENT_TRIGGEROID)
 			is_event_trigger = true;
 		else if (proc->prorettype != RECORDOID &&
 				 proc->prorettype != VOIDOID &&
diff --git a/src/pl/plpython/plpy_procedure.c b/src/pl/plpython/plpy_procedure.c
index ec47f52e61..1f05c633ef 100644
--- a/src/pl/plpython/plpy_procedure.c
+++ b/src/pl/plpython/plpy_procedure.c
@@ -220,7 +220,7 @@ PLy_procedure_create(HeapTuple procTup, Oid fn_oid, bool is_trigger)
 				if (rettype == VOIDOID ||
 					rettype == RECORDOID)
 					 /* okay */ ;
-				else if (rettype == TRIGGEROID || rettype == EVTTRIGGEROID)
+				else if (rettype == TRIGGEROID || rettype == EVENT_TRIGGEROID)
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 							 errmsg("trigger functions can only be called as triggers")));
diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c
index f4eabc8f39..a3a2dc8e89 100644
--- a/src/pl/tcl/pltcl.c
+++ b/src/pl/tcl/pltcl.c
@@ -1532,7 +1532,7 @@ compile_pltcl_function(Oid fn_oid, Oid tgreloid,
 					rettype == RECORDOID)
 					 /* okay */ ;
 				else if (rettype == TRIGGEROID ||
-						 rettype == EVTTRIGGEROID)
+						 rettype == EVENT_TRIGGEROID)
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 							 errmsg("trigger functions can only be called as triggers")));