* by PostgreSQL
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.541 2009/07/20 20:53:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.542 2009/07/23 22:59:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
static void dumpEnumType(Archive *fout, TypeInfo *tinfo);
static void dumpDomain(Archive *fout, TypeInfo *tinfo);
static void dumpCompositeType(Archive *fout, TypeInfo *tinfo);
+static void dumpCompositeTypeColComments(Archive *fout, TypeInfo *tinfo);
static void dumpShellType(Archive *fout, ShellTypeInfo *stinfo);
static void dumpProcLang(Archive *fout, ProcLangInfo *plang);
static void dumpFunc(Archive *fout, FuncInfo *finfo);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
destroyPQExpBuffer(query);
+
+ /* Dump any per-column comments */
+ dumpCompositeTypeColComments(fout, tinfo);
+}
+
+/*
+ * dumpCompositeTypeColComments
+ * writes out to fout the queries to recreate comments on the columns of
+ * a user-defined stand-alone composite type
+ */
+static void
+dumpCompositeTypeColComments(Archive *fout, TypeInfo *tinfo)
+{
+ CommentItem *comments;
+ int ncomments;
+ PGresult *res;
+ PQExpBuffer query;
+ PQExpBuffer target;
+ Oid pgClassOid;
+ int i;
+ int ntups;
+ int i_attname;
+ int i_attnum;
+
+ query = createPQExpBuffer();
+
+ /* We assume here that remoteVersion must be at least 70300 */
+ appendPQExpBuffer(query,
+ "SELECT c.tableoid, a.attname, a.attnum "
+ "FROM pg_catalog.pg_class c, pg_catalog.pg_attribute a "
+ "WHERE c.oid = '%u' AND c.oid = a.attrelid "
+ " AND NOT a.attisdropped "
+ "ORDER BY a.attnum ",
+ tinfo->typrelid);
+
+ /* Fetch column attnames */
+ res = PQexec(g_conn, query->data);
+ check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK);
+
+ /* Expecting at least a single result */
+ ntups = PQntuples(res);
+ if (ntups < 1)
+ {
+ write_msg(NULL, "query returned no rows: %s\n", query->data);
+ exit_nicely();
+ }
+
+ pgClassOid = atooid(PQgetvalue(res, 0, PQfnumber(res, "tableoid")));
+
+ /* Search for comments associated with type's pg_class OID */
+ ncomments = findComments(fout,
+ pgClassOid,
+ tinfo->typrelid,
+ &comments);
+
+ /* If no comments exist, we're done */
+ if (ncomments <= 0)
+ {
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ return;
+ }
+
+ /* Build COMMENT ON statements */
+ target = createPQExpBuffer();
+
+ i_attnum = PQfnumber(res, "attnum");
+ i_attname = PQfnumber(res, "attname");
+ while (ncomments > 0)
+ {
+ const char *attname;
+
+ attname = NULL;
+ for (i = 0; i < ntups; i++)
+ {
+ if (atoi(PQgetvalue(res, i, i_attnum)) == comments->objsubid)
+ {
+ attname = PQgetvalue(res, i, i_attname);
+ break;
+ }
+ }
+ if (attname) /* just in case we don't find it */
+ {
+ const char *descr = comments->descr;
+
+ resetPQExpBuffer(target);
+ appendPQExpBuffer(target, "COLUMN %s.",
+ fmtId(tinfo->dobj.name));
+ appendPQExpBuffer(target, "%s",
+ fmtId(attname));
+
+ resetPQExpBuffer(query);
+ appendPQExpBuffer(query, "COMMENT ON %s IS ", target->data);
+ appendStringLiteralAH(query, descr, fout);
+ appendPQExpBuffer(query, ";\n");
+
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ target->data,
+ tinfo->dobj.namespace->dobj.name,
+ NULL, tinfo->rolname,
+ false, "COMMENT", SECTION_NONE,
+ query->data, "", NULL,
+ &(tinfo->dobj.dumpId), 1,
+ NULL, NULL);
+ }
+
+ comments++;
+ ncomments--;
+ }
+
+ PQclear(res);
+ destroyPQExpBuffer(query);
+ destroyPQExpBuffer(target);
}
/*