Make GetSlotInvalidationCause() return RS_INVAL_NONE on unexpected input
authorMichael Paquier <michael@paquier.xyz>
Thu, 22 Feb 2024 10:59:58 +0000 (19:59 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 22 Feb 2024 10:59:58 +0000 (19:59 +0900)
943f7ae1c869 has changed GetSlotInvalidationCause() so as it would
return the last element of SlotInvalidationCauses[] when an incorrect
conflict reason name is given by a caller, but this should return
RS_INVAL_NONE in such cases, even if such a state should never be
reached in practice.

Per gripe from Peter Smith.

Reviewed-by: Bharath Rupireddy
Discussion: https://postgr.es/m/CAHut+PtsrSWxczpGkSaSVtJo+BXrvJ3Hwp5gES14bbL-G+HL7A@mail.gmail.com

src/backend/replication/slot.c

index 033b4ce0971a11b9aa942cbc9da915f04df8af50..0f173f63a28ca8e4be2fe5484ee812a873d73c00 100644 (file)
@@ -2327,6 +2327,7 @@ ReplicationSlotInvalidationCause
 GetSlotInvalidationCause(const char *conflict_reason)
 {
    ReplicationSlotInvalidationCause cause;
+   ReplicationSlotInvalidationCause result = RS_INVAL_NONE;
    bool        found PG_USED_FOR_ASSERTS_ONLY = false;
 
    Assert(conflict_reason);
@@ -2336,10 +2337,11 @@ GetSlotInvalidationCause(const char *conflict_reason)
        if (strcmp(SlotInvalidationCauses[cause], conflict_reason) == 0)
        {
            found = true;
+           result = cause;
            break;
        }
    }
 
    Assert(found);
-   return cause;
+   return result;
 }