int         i_attislocal;
    int         i_attoptions;
    int         i_attcollation;
+   int         i_attfdwoptions;
    PGresult   *res;
    int         ntups;
    bool        hasdefaults;
 
        resetPQExpBuffer(q);
 
-       if (g_fout->remoteVersion >= 90100)
+       if (g_fout->remoteVersion >= 90200)
+       {
+           /*
+            * attfdwoptions is new in 9.2.
+            */
+           appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, "
+                             "a.attstattarget, a.attstorage, t.typstorage, "
+                             "a.attnotnull, a.atthasdef, a.attisdropped, "
+                             "a.attlen, a.attalign, a.attislocal, "
+                 "pg_catalog.format_type(t.oid,a.atttypmod) AS atttypname, "
+                       "array_to_string(a.attoptions, ', ') AS attoptions, "
+                             "CASE WHEN a.attcollation <> t.typcollation "
+                           "THEN a.attcollation ELSE 0 END AS attcollation, "
+                 "array_to_string(ARRAY("
+                 "  SELECT option_name || ' ' || quote_literal(option_value) "
+                 "  FROM pg_options_to_table(attfdwoptions)), ', ') "
+                 " AS attfdwoptions "
+            "FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t "
+                             "ON a.atttypid = t.oid "
+                             "WHERE a.attrelid = '%u'::pg_catalog.oid "
+                             "AND a.attnum > 0::pg_catalog.int2 "
+                             "ORDER BY a.attrelid, a.attnum",
+                             tbinfo->dobj.catId.oid);
+       }
+       else if (g_fout->remoteVersion >= 90100)
        {
            /*
             * attcollation is new in 9.1.  Since we only want to dump COLLATE
                              "ORDER BY a.attrelid, a.attnum",
                              tbinfo->dobj.catId.oid);
        }
+
        else if (g_fout->remoteVersion >= 90000)
        {
            /* attoptions is new in 9.0 */
        i_attislocal = PQfnumber(res, "attislocal");
        i_attoptions = PQfnumber(res, "attoptions");
        i_attcollation = PQfnumber(res, "attcollation");
+       i_attfdwoptions = PQfnumber(res, "attfdwoptions");
 
        tbinfo->numatts = ntups;
        tbinfo->attnames = (char **) malloc(ntups * sizeof(char *));
        tbinfo->attrdefs = (AttrDefInfo **) malloc(ntups * sizeof(AttrDefInfo *));
        tbinfo->attoptions = (char **) malloc(ntups * sizeof(char *));
        tbinfo->attcollation = (Oid *) malloc(ntups * sizeof(Oid));
+       tbinfo->attfdwoptions = (char **) malloc(ntups * sizeof(char *));
        tbinfo->inhAttrs = (bool *) malloc(ntups * sizeof(bool));
        tbinfo->inhAttrDef = (bool *) malloc(ntups * sizeof(bool));
        tbinfo->inhNotNull = (bool *) malloc(ntups * sizeof(bool));
            tbinfo->notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't');
            tbinfo->attoptions[j] = strdup(PQgetvalue(res, j, i_attoptions));
            tbinfo->attcollation[j] = atooid(PQgetvalue(res, j, i_attcollation));
+           tbinfo->attfdwoptions[j] = strdup(PQgetvalue(res, j, i_attfdwoptions));
            tbinfo->attrdefs[j] = NULL; /* fix below */
            if (PQgetvalue(res, j, i_atthasdef)[0] == 't')
                hasdefaults = true;
                appendPQExpBuffer(q, "SET (%s);\n",
                                  tbinfo->attoptions[j]);
            }
+
+           /*
+            * Dump per-column generic options.
+            */
+           if (tbinfo->relkind == RELKIND_FOREIGN_TABLE &&
+               tbinfo->attfdwoptions[j] &&
+               tbinfo->attfdwoptions[j][0] != '\0')
+           {
+               appendPQExpBuffer(q, "ALTER FOREIGN TABLE %s ",
+                                 fmtId(tbinfo->dobj.name));
+               appendPQExpBuffer(q, "ALTER COLUMN %s ",
+                                 fmtId(tbinfo->attnames[j]));
+               appendPQExpBuffer(q, "OPTIONS (%s);\n",
+                                 tbinfo->attfdwoptions[j]);
+           }
        }
    }