|
12 | 12 | * by PostgreSQL
|
13 | 13 | *
|
14 | 14 | * IDENTIFICATION
|
15 |
| - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.541 2009/07/20 20:53:40 momjian Exp $ |
| 15 | + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.542 2009/07/23 22:59:40 tgl Exp $ |
16 | 16 | *
|
17 | 17 | *-------------------------------------------------------------------------
|
18 | 18 | */
|
@@ -134,6 +134,7 @@ static void dumpBaseType(Archive *fout, TypeInfo *tinfo);
|
134 | 134 | static void dumpEnumType(Archive *fout, TypeInfo *tinfo);
|
135 | 135 | static void dumpDomain(Archive *fout, TypeInfo *tinfo);
|
136 | 136 | static void dumpCompositeType(Archive *fout, TypeInfo *tinfo);
|
| 137 | +static void dumpCompositeTypeColComments(Archive *fout, TypeInfo *tinfo); |
137 | 138 | static void dumpShellType(Archive *fout, ShellTypeInfo *stinfo);
|
138 | 139 | static void dumpProcLang(Archive *fout, ProcLangInfo *plang);
|
139 | 140 | static void dumpFunc(Archive *fout, FuncInfo *finfo);
|
@@ -6755,6 +6756,119 @@ dumpCompositeType(Archive *fout, TypeInfo *tinfo)
|
6755 | 6756 | destroyPQExpBuffer(q);
|
6756 | 6757 | destroyPQExpBuffer(delq);
|
6757 | 6758 | destroyPQExpBuffer(query);
|
| 6759 | + |
| 6760 | + /* Dump any per-column comments */ |
| 6761 | + dumpCompositeTypeColComments(fout, tinfo); |
| 6762 | +} |
| 6763 | + |
| 6764 | +/* |
| 6765 | + * dumpCompositeTypeColComments |
| 6766 | + * writes out to fout the queries to recreate comments on the columns of |
| 6767 | + * a user-defined stand-alone composite type |
| 6768 | + */ |
| 6769 | +static void |
| 6770 | +dumpCompositeTypeColComments(Archive *fout, TypeInfo *tinfo) |
| 6771 | +{ |
| 6772 | + CommentItem *comments; |
| 6773 | + int ncomments; |
| 6774 | + PGresult *res; |
| 6775 | + PQExpBuffer query; |
| 6776 | + PQExpBuffer target; |
| 6777 | + Oid pgClassOid; |
| 6778 | + int i; |
| 6779 | + int ntups; |
| 6780 | + int i_attname; |
| 6781 | + int i_attnum; |
| 6782 | + |
| 6783 | + query = createPQExpBuffer(); |
| 6784 | + |
| 6785 | + /* We assume here that remoteVersion must be at least 70300 */ |
| 6786 | + appendPQExpBuffer(query, |
| 6787 | + "SELECT c.tableoid, a.attname, a.attnum " |
| 6788 | + "FROM pg_catalog.pg_class c, pg_catalog.pg_attribute a " |
| 6789 | + "WHERE c.oid = '%u' AND c.oid = a.attrelid " |
| 6790 | + " AND NOT a.attisdropped " |
| 6791 | + "ORDER BY a.attnum ", |
| 6792 | + tinfo->typrelid); |
| 6793 | + |
| 6794 | + /* Fetch column attnames */ |
| 6795 | + res = PQexec(g_conn, query->data); |
| 6796 | + check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK); |
| 6797 | + |
| 6798 | + /* Expecting at least a single result */ |
| 6799 | + ntups = PQntuples(res); |
| 6800 | + if (ntups < 1) |
| 6801 | + { |
| 6802 | + write_msg(NULL, "query returned no rows: %s\n", query->data); |
| 6803 | + exit_nicely(); |
| 6804 | + } |
| 6805 | + |
| 6806 | + pgClassOid = atooid(PQgetvalue(res, 0, PQfnumber(res, "tableoid"))); |
| 6807 | + |
| 6808 | + /* Search for comments associated with type's pg_class OID */ |
| 6809 | + ncomments = findComments(fout, |
| 6810 | + pgClassOid, |
| 6811 | + tinfo->typrelid, |
| 6812 | + &comments); |
| 6813 | + |
| 6814 | + /* If no comments exist, we're done */ |
| 6815 | + if (ncomments <= 0) |
| 6816 | + { |
| 6817 | + PQclear(res); |
| 6818 | + destroyPQExpBuffer(query); |
| 6819 | + return; |
| 6820 | + } |
| 6821 | + |
| 6822 | + /* Build COMMENT ON statements */ |
| 6823 | + target = createPQExpBuffer(); |
| 6824 | + |
| 6825 | + i_attnum = PQfnumber(res, "attnum"); |
| 6826 | + i_attname = PQfnumber(res, "attname"); |
| 6827 | + while (ncomments > 0) |
| 6828 | + { |
| 6829 | + const char *attname; |
| 6830 | + |
| 6831 | + attname = NULL; |
| 6832 | + for (i = 0; i < ntups; i++) |
| 6833 | + { |
| 6834 | + if (atoi(PQgetvalue(res, i, i_attnum)) == comments->objsubid) |
| 6835 | + { |
| 6836 | + attname = PQgetvalue(res, i, i_attname); |
| 6837 | + break; |
| 6838 | + } |
| 6839 | + } |
| 6840 | + if (attname) /* just in case we don't find it */ |
| 6841 | + { |
| 6842 | + const char *descr = comments->descr; |
| 6843 | + |
| 6844 | + resetPQExpBuffer(target); |
| 6845 | + appendPQExpBuffer(target, "COLUMN %s.", |
| 6846 | + fmtId(tinfo->dobj.name)); |
| 6847 | + appendPQExpBuffer(target, "%s", |
| 6848 | + fmtId(attname)); |
| 6849 | + |
| 6850 | + resetPQExpBuffer(query); |
| 6851 | + appendPQExpBuffer(query, "COMMENT ON %s IS ", target->data); |
| 6852 | + appendStringLiteralAH(query, descr, fout); |
| 6853 | + appendPQExpBuffer(query, ";\n"); |
| 6854 | + |
| 6855 | + ArchiveEntry(fout, nilCatalogId, createDumpId(), |
| 6856 | + target->data, |
| 6857 | + tinfo->dobj.namespace->dobj.name, |
| 6858 | + NULL, tinfo->rolname, |
| 6859 | + false, "COMMENT", SECTION_NONE, |
| 6860 | + query->data, "", NULL, |
| 6861 | + &(tinfo->dobj.dumpId), 1, |
| 6862 | + NULL, NULL); |
| 6863 | + } |
| 6864 | + |
| 6865 | + comments++; |
| 6866 | + ncomments--; |
| 6867 | + } |
| 6868 | + |
| 6869 | + PQclear(res); |
| 6870 | + destroyPQExpBuffer(query); |
| 6871 | + destroyPQExpBuffer(target); |
6758 | 6872 | }
|
6759 | 6873 |
|
6760 | 6874 | /*
|
|
0 commit comments