From 15df037845d9d3d99e9e2b4370256b136b00c66a Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 5 Jan 2012 20:34:07 +0200 Subject: [PATCH] pg_dump: Dump operators with the same name ordered by arity pg_dump sorts operators by name, but operators with the same name come out in random order. Now operators with the same name are dumped in the order prefix, postfix, infix. (This is consistent with functions, which are dumped in increasing number of argument order.) --- src/bin/pg_dump/pg_dump.c | 6 ++++++ src/bin/pg_dump/pg_dump.h | 1 + src/bin/pg_dump/pg_dump_sort.c | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 1985c7d508..af45886ac2 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 913d1022d6..11c4d37127 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 c605a3b724..4d1ae94ef5 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); -- 2.40.0