]> granicus.if.org Git - postgresql/commitdiff
pg_dump: Dump operators with the same name ordered by arity
authorPeter Eisentraut <peter_e@gmx.net>
Thu, 5 Jan 2012 18:34:07 +0000 (20:34 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Thu, 5 Jan 2012 18:34:07 +0000 (20:34 +0200)
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
src/bin/pg_dump/pg_dump.h
src/bin/pg_dump/pg_dump_sort.c

index 1985c7d508cb8dbe1ebd1b54f3c9c72dc1dbe105..af45886ac20b166d0fdb14babb0a5a96bbe3c0b7 100644 (file)
@@ -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 */
index 913d1022d62ee284f25007348f56bc4a7d28e0db..11c4d37127087ddcffbd8b769a7d97c57268030b 100644 (file)
@@ -204,6 +204,7 @@ typedef struct _oprInfo
 {
        DumpableObject dobj;
        char       *rolname;
+       char            oprkind;
        Oid                     oprcode;
 } OprInfo;
 
index c605a3b7247e59189710eb1f4c81c9b28d7f5419..4d1ae94ef5142ed27d55a0a90544edaf4658530d 100644 (file)
@@ -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);