Update some more ObjectType switch statements to not have default

Started by Peter Eisentrautabout 3 years ago1 messages
#1Peter Eisentraut
peter.eisentraut@enterprisedb.com
1 attachment(s)

This arose during the review of another patch.

We often omit the default case of a switch statement to allow the
compiler to complain if an enum case has been missed. I found a few
where that wasn't done yet, but it would make sense and would have found
an omission in another patch.

Attachments:

0001-Update-some-more-ObjectType-switch-statements-to-not.patchtext/plain; charset=UTF-8; name=0001-Update-some-more-ObjectType-switch-statements-to-not.patchDownload
From 37a03b420ce52f02119a0085f3c5f6666e3b44fb Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Wed, 9 Nov 2022 14:52:33 +0100
Subject: [PATCH] Update some more ObjectType switch statements to not have
 default

This allows the compiler to complain if a case has been missed.  In
these instances, the tradeoff of having to list a few unneeded cases
to silence the compiler seems better than the risk of actually missing
one.
---
 src/backend/catalog/objectaddress.c | 26 +++++++++++--------
 src/backend/commands/dropcmds.c     | 39 +++++++++++++++++++++++++++--
 2 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index c7de7232b890..f36581d106b2 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -960,7 +960,7 @@ ObjectAddress
 get_object_address(ObjectType objtype, Node *object,
 				   Relation *relp, LOCKMODE lockmode, bool missing_ok)
 {
-	ObjectAddress address;
+	ObjectAddress address = {InvalidOid, InvalidOid, 0};
 	ObjectAddress old_address = {InvalidOid, InvalidOid, 0};
 	Relation	relation = NULL;
 	uint64		inval_count;
@@ -991,6 +991,7 @@ get_object_address(ObjectType objtype, Node *object,
 												   &relation, lockmode,
 												   missing_ok);
 				break;
+			case OBJECT_ATTRIBUTE:
 			case OBJECT_COLUMN:
 				address =
 					get_object_address_attribute(objtype, castNode(List, object),
@@ -1163,14 +1164,12 @@ get_object_address(ObjectType objtype, Node *object,
 															 missing_ok);
 				address.objectSubId = 0;
 				break;
-			default:
-				elog(ERROR, "unrecognized object type: %d", (int) objtype);
-				/* placate compiler, in case it thinks elog might return */
-				address.classId = InvalidOid;
-				address.objectId = InvalidOid;
-				address.objectSubId = 0;
+				/* no default, to let compiler warn about missing case */
 		}
 
+		if (!address.classId)
+			elog(ERROR, "unrecognized object type: %d", (int) objtype);
+
 		/*
 		 * If we could not find the supplied object, return without locking.
 		 */
@@ -2635,9 +2634,16 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
 				aclcheck_error(ACLCHECK_NOT_OWNER, objtype,
 							   NameListToString(castNode(List, object)));
 			break;
-		default:
-			elog(ERROR, "unrecognized object type: %d",
-				 (int) objtype);
+		case OBJECT_AMOP:
+		case OBJECT_AMPROC:
+		case OBJECT_DEFAULT:
+		case OBJECT_DEFACL:
+		case OBJECT_PUBLICATION_NAMESPACE:
+		case OBJECT_PUBLICATION_REL:
+		case OBJECT_USER_MAPPING:
+			/* These are currently not supported or don't make sense here. */
+			elog(ERROR, "unsupported object type: %d", (int) objtype);
+			break;
 	}
 }
 
diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c
index 26157eb4e3f5..8bac58a9941a 100644
--- a/src/backend/commands/dropcmds.c
+++ b/src/backend/commands/dropcmds.c
@@ -480,10 +480,45 @@ does_not_exist_skipping(ObjectType objtype, Node *object)
 			msg = gettext_noop("publication \"%s\" does not exist, skipping");
 			name = strVal(object);
 			break;
-		default:
-			elog(ERROR, "unrecognized object type: %d", (int) objtype);
+
+		case OBJECT_COLUMN:
+		case OBJECT_DATABASE:
+		case OBJECT_FOREIGN_TABLE:
+		case OBJECT_INDEX:
+		case OBJECT_MATVIEW:
+		case OBJECT_ROLE:
+		case OBJECT_SEQUENCE:
+		case OBJECT_SUBSCRIPTION:
+		case OBJECT_TABLE:
+		case OBJECT_TABLESPACE:
+		case OBJECT_VIEW:
+			/*
+			 * These are handled elsewhere, so if someone gets here the code
+			 * is probably wrong or should be revisited.
+			 */
+			elog(ERROR, "unsupported object type: %d", (int) objtype);
+			break;
+
+		case OBJECT_AMOP:
+		case OBJECT_AMPROC:
+		case OBJECT_ATTRIBUTE:
+		case OBJECT_DEFAULT:
+		case OBJECT_DEFACL:
+		case OBJECT_DOMCONSTRAINT:
+		case OBJECT_LARGEOBJECT:
+		case OBJECT_PARAMETER_ACL:
+		case OBJECT_PUBLICATION_NAMESPACE:
+		case OBJECT_PUBLICATION_REL:
+		case OBJECT_TABCONSTRAINT:
+		case OBJECT_USER_MAPPING:
+			/* These are currently not used or needed. */
+			elog(ERROR, "unsupported object type: %d", (int) objtype);
 			break;
+
+			/* no default, to let compiler warn about missing case */
 	}
+	if (!msg)
+		elog(ERROR, "unrecognized object type: %d", (int) objtype);
 
 	if (!args)
 		ereport(NOTICE, (errmsg(msg, name)));
-- 
2.38.1