diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 1985c7d508c..af45886ac20 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -3138,6 +3138,7 @@ getOperators(int *numOprs) int i_oprname; int i_oprnamespace; int i_rolname; + int i_oprkind; int i_oprcode; /* @@ -3153,6 +3154,7 @@ getOperators(int *numOprs) appendPQExpBuffer(query, "SELECT tableoid, oid, oprname, " "oprnamespace, " "(%s oprowner) AS rolname, " + "oprkind, " "oprcode::oid AS oprcode " "FROM pg_operator", username_subquery); @@ -3162,6 +3164,7 @@ getOperators(int *numOprs) appendPQExpBuffer(query, "SELECT tableoid, oid, oprname, " "0::oid AS oprnamespace, " "(%s oprowner) AS rolname, " + "oprkind, " "oprcode::oid AS oprcode " "FROM pg_operator", username_subquery); @@ -3173,6 +3176,7 @@ getOperators(int *numOprs) "oid, oprname, " "0::oid AS oprnamespace, " "(%s oprowner) AS rolname, " + "oprkind, " "oprcode::oid AS oprcode " "FROM pg_operator", username_subquery); @@ -3191,6 +3195,7 @@ getOperators(int *numOprs) i_oprname = PQfnumber(res, "oprname"); i_oprnamespace = PQfnumber(res, "oprnamespace"); i_rolname = PQfnumber(res, "rolname"); + i_oprkind = PQfnumber(res, "oprkind"); i_oprcode = PQfnumber(res, "oprcode"); for (i = 0; i < ntups; i++) @@ -3203,6 +3208,7 @@ getOperators(int *numOprs) oprinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)), oprinfo[i].dobj.catId.oid); oprinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0]; oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode)); /* Decide whether we want to dump it */ diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 913d1022d62..11c4d371270 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -204,6 +204,7 @@ typedef struct _oprInfo { DumpableObject dobj; char *rolname; + char oprkind; Oid oprcode; } OprInfo; diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index c605a3b7247..4d1ae94ef51 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -178,6 +178,16 @@ DOTypeNameCompare(const void *p1, const void *p2) if (cmpval != 0) return cmpval; } + else if (obj1->objType == DO_OPERATOR) + { + OprInfo *oobj1 = *(OprInfo * const *) p1; + OprInfo *oobj2 = *(OprInfo * const *) p2; + + /* oprkind is 'l', 'r', or 'b'; this sorts prefix, postfix, infix */ + cmpval = (oobj2->oprkind - oobj1->oprkind); + if (cmpval != 0) + return cmpval; + } /* Usually shouldn't get here, but if we do, sort by OID */ return oidcmp(obj1->catId.oid, obj2->catId.oid);