mirror of
https://github.com/postgres/postgres.git
synced 2025-06-08 22:02:03 +03:00
Fix pg_dump to handle collations applied to columns of composite types.
CREATE TYPE and ALTER TYPE ADD ATTRIBUTE handle this, so I suppose it's an intended feature, but pg_dump didn't know about it.
This commit is contained in:
parent
49a642ab18
commit
acfa1f45ed
@ -7944,6 +7944,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
|
|||||||
int ntups;
|
int ntups;
|
||||||
int i_attname;
|
int i_attname;
|
||||||
int i_atttypdefn;
|
int i_atttypdefn;
|
||||||
|
int i_attcollation;
|
||||||
int i_typrelid;
|
int i_typrelid;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -7951,17 +7952,42 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
|
|||||||
selectSourceSchema(tyinfo->dobj.namespace->dobj.name);
|
selectSourceSchema(tyinfo->dobj.namespace->dobj.name);
|
||||||
|
|
||||||
/* Fetch type specific details */
|
/* Fetch type specific details */
|
||||||
/* We assume here that remoteVersion must be at least 70300 */
|
if (fout->remoteVersion >= 90100)
|
||||||
|
{
|
||||||
appendPQExpBuffer(query, "SELECT a.attname, "
|
/*
|
||||||
"pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
|
* attcollation is new in 9.1. Since we only want to dump COLLATE
|
||||||
"typrelid "
|
* clauses for attributes whose collation is different from their
|
||||||
"FROM pg_catalog.pg_type t, pg_catalog.pg_attribute a "
|
* type's default, we use a CASE here to suppress uninteresting
|
||||||
"WHERE t.oid = '%u'::pg_catalog.oid "
|
* attcollations cheaply.
|
||||||
"AND a.attrelid = t.typrelid "
|
*/
|
||||||
"AND NOT a.attisdropped "
|
appendPQExpBuffer(query, "SELECT a.attname, "
|
||||||
"ORDER BY a.attnum ",
|
"pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
|
||||||
tyinfo->dobj.catId.oid);
|
"CASE WHEN a.attcollation <> at.typcollation "
|
||||||
|
"THEN a.attcollation ELSE 0 END AS attcollation, "
|
||||||
|
"ct.typrelid "
|
||||||
|
"FROM pg_catalog.pg_type ct, pg_catalog.pg_attribute a, "
|
||||||
|
"pg_catalog.pg_type at "
|
||||||
|
"WHERE ct.oid = '%u'::pg_catalog.oid "
|
||||||
|
"AND a.attrelid = ct.typrelid "
|
||||||
|
"AND a.atttypid = at.oid "
|
||||||
|
"AND NOT a.attisdropped "
|
||||||
|
"ORDER BY a.attnum ",
|
||||||
|
tyinfo->dobj.catId.oid);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We assume here that remoteVersion must be at least 70300 */
|
||||||
|
appendPQExpBuffer(query, "SELECT a.attname, "
|
||||||
|
"pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
|
||||||
|
"0 AS attcollation, "
|
||||||
|
"ct.typrelid "
|
||||||
|
"FROM pg_catalog.pg_type ct, pg_catalog.pg_attribute a "
|
||||||
|
"WHERE ct.oid = '%u'::pg_catalog.oid "
|
||||||
|
"AND a.attrelid = ct.typrelid "
|
||||||
|
"AND NOT a.attisdropped "
|
||||||
|
"ORDER BY a.attnum ",
|
||||||
|
tyinfo->dobj.catId.oid);
|
||||||
|
}
|
||||||
|
|
||||||
res = PQexec(g_conn, query->data);
|
res = PQexec(g_conn, query->data);
|
||||||
check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK);
|
check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK);
|
||||||
@ -7970,6 +7996,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
|
|||||||
|
|
||||||
i_attname = PQfnumber(res, "attname");
|
i_attname = PQfnumber(res, "attname");
|
||||||
i_atttypdefn = PQfnumber(res, "atttypdefn");
|
i_atttypdefn = PQfnumber(res, "atttypdefn");
|
||||||
|
i_attcollation = PQfnumber(res, "attcollation");
|
||||||
i_typrelid = PQfnumber(res, "typrelid");
|
i_typrelid = PQfnumber(res, "typrelid");
|
||||||
|
|
||||||
if (binary_upgrade)
|
if (binary_upgrade)
|
||||||
@ -7987,11 +8014,30 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
|
|||||||
{
|
{
|
||||||
char *attname;
|
char *attname;
|
||||||
char *atttypdefn;
|
char *atttypdefn;
|
||||||
|
Oid attcollation;
|
||||||
|
|
||||||
attname = PQgetvalue(res, i, i_attname);
|
attname = PQgetvalue(res, i, i_attname);
|
||||||
atttypdefn = PQgetvalue(res, i, i_atttypdefn);
|
atttypdefn = PQgetvalue(res, i, i_atttypdefn);
|
||||||
|
attcollation = atooid(PQgetvalue(res, i, i_attcollation));
|
||||||
|
|
||||||
appendPQExpBuffer(q, "\n\t%s %s", fmtId(attname), atttypdefn);
|
appendPQExpBuffer(q, "\n\t%s %s", fmtId(attname), atttypdefn);
|
||||||
|
|
||||||
|
/* Add collation if not default for the column type */
|
||||||
|
if (OidIsValid(attcollation))
|
||||||
|
{
|
||||||
|
CollInfo *coll;
|
||||||
|
|
||||||
|
coll = findCollationByOid(attcollation);
|
||||||
|
if (coll)
|
||||||
|
{
|
||||||
|
/* always schema-qualify, don't try to be smart */
|
||||||
|
appendPQExpBuffer(q, " COLLATE %s.",
|
||||||
|
fmtId(coll->dobj.namespace->dobj.name));
|
||||||
|
appendPQExpBuffer(q, "%s",
|
||||||
|
fmtId(coll->dobj.name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (i < ntups - 1)
|
if (i < ntups - 1)
|
||||||
appendPQExpBuffer(q, ",");
|
appendPQExpBuffer(q, ",");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user