Avoid casting away const in sepgsql's quote_object_name.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 27 Aug 2022 16:52:39 +0000 (12:52 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 27 Aug 2022 16:52:39 +0000 (12:52 -0400)
quote_identifier's API is designed on the assumption that it's
not worth worrying about a short-term memory leak when we have
to produce a quoted version of the given identifier.  Whoever wrote
quote_object_name took it on themselves to override that judgment,
but the only way to do so is to cast away const someplace.  We can
avoid that and substantially shorten the function by going along
with quote_identifier's opinion.  AFAICS quote_object_name is not
used in any way where this would be unsustainable.

Per discussion of commit 45987aae2, which exposed that we had
a casting-away-const situation here.

Discussion: https://postgr.es/m/20220827112304.GL2342@telsasoft.com

contrib/sepgsql/label.c

index 6e7c0d7cfff7065b5314e21e4115625591f3db91..440d9f0d50708081a689f0d9d07e803222a6adf9 100644 (file)
@@ -646,45 +646,24 @@ sepgsql_mcstrans_out(PG_FUNCTION_ARGS)
 /*
  * quote_object_name
  *
- * It tries to quote the supplied identifiers
+ * Concatenate as many of the given strings as aren't NULL, with dots between.
+ * Quote any of the strings that wouldn't be valid identifiers otherwise.
  */
 static char *
 quote_object_name(const char *src1, const char *src2,
                  const char *src3, const char *src4)
 {
    StringInfoData result;
-   const char *temp;
 
    initStringInfo(&result);
-
    if (src1)
-   {
-       temp = quote_identifier(src1);
-       appendStringInfoString(&result, temp);
-       if (src1 != temp)
-           pfree(temp);
-   }
+       appendStringInfoString(&result, quote_identifier(src1));
    if (src2)
-   {
-       temp = quote_identifier(src2);
-       appendStringInfo(&result, ".%s", temp);
-       if (src2 != temp)
-           pfree(temp);
-   }
+       appendStringInfo(&result, ".%s", quote_identifier(src2));
    if (src3)
-   {
-       temp = quote_identifier(src3);
-       appendStringInfo(&result, ".%s", temp);
-       if (src3 != temp)
-           pfree(temp);
-   }
+       appendStringInfo(&result, ".%s", quote_identifier(src3));
    if (src4)
-   {
-       temp = quote_identifier(src4);
-       appendStringInfo(&result, ".%s", temp);
-       if (src4 != temp)
-           pfree(temp);
-   }
+       appendStringInfo(&result, ".%s", quote_identifier(src4));
    return result.data;
 }