aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2012-01-05 20:34:07 +0200
committerPeter Eisentraut <peter_e@gmx.net>2012-01-05 20:34:07 +0200
commit15df037845d9d3d99e9e2b4370256b136b00c66a (patch)
tree038342c15685d364b1990501d1a8040ba44dbd12 /src
parent104e7dac28c56dcaf9b778dff60a5daefc3a0661 (diff)
downloadpostgresql-15df037845d9d3d99e9e2b4370256b136b00c66a.tar.gz
postgresql-15df037845d9d3d99e9e2b4370256b136b00c66a.zip
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.)
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_dump.c6
-rw-r--r--src/bin/pg_dump/pg_dump.h1
-rw-r--r--src/bin/pg_dump/pg_dump_sort.c10
3 files changed, 17 insertions, 0 deletions
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);