On Fri, Oct 16, 2015 at 5:40 PM, Akshay Joshi <akshay.jo...@enterprisedb.com > wrote:
> Hi Ashesh > Hi Akshay, I've modified the patch a little bit for betterment. Can you please review and test it? -- Thanks & Regards, Ashesh Vashi > > > On Thu, Oct 15, 2015 at 1:51 PM, Ashesh Vashi <ashesh.vashi@enterprisedb > .com> wrote: > >> On Thu, Oct 15, 2015 at 11:15 AM, JasmineLiu <liuyuanyuang...@gmail.com> >> wrote: >> >>> Hi, all ! >>> >>> This is Liu Yuanyuan. >>> I find the inherited table of column shown in pgadmin 1.20.0, sometimes >>> isn’t right. That should be a bug. >>> Hope someone to do something about this problem! >>> Here is my example: >>> >>> First I execute the following sql in pgadmin 1.20.0 by query tool: >>> create schema test; >>> create table test.a1(id int); >>> create table test.a2(id int, name varchar); >>> create table test.a3(age int); >>> create table test.aa() inherits(test.a1,test.a2,test.a3); >>> >>> >>> Then in main view of pgadmin 1.20.0: >>> It shows the column age is inherited from table test.a2, this is not >>> right. >>> <http://postgresql.nabble.com/file/n5870044/1.jpg> >>> <http://postgresql.nabble.com/file/n5870044/2.jpg> >>> >> Looks like a bug to me. >> >> Akshay, >> >> Can you please take a look at it? >> > > I have fixed the issue, attached is the patch file. Can you please > review it and if it looks good can you please commit the code. > >> >> -- >> >> Thanks & Regards, >> >> Ashesh Vashi >> EnterpriseDB INDIA: Enterprise PostgreSQL Company >> <http://www.enterprisedb.com> >> >> >> *http://www.linkedin.com/in/asheshvashi* >> <http://www.linkedin.com/in/asheshvashi> >> >> >>> >>> I also check the code of pgadmin 1.20.0, I think the method to specify >>> the >>> inherited table of columns is not correct,especially when the inherited >>> tables have same column. >>> >>> Thanks and hope to hear from you soon! >>> >>> Best wishes! >>> Liu Yuanyuan >>> >>> >>> >>> >>> -- >>> View this message in context: >>> http://postgresql.nabble.com/Error-about-inherited-table-of-column-in-pgadmin1-20-0-tp5870044.html >>> Sent from the PostgreSQL - pgadmin support mailing list archive at >>> Nabble.com. >>> >>> >>> -- >>> Sent via pgadmin-support mailing list (pgadmin-support@postgresql.org) >>> To make changes to your subscription: >>> http://www.postgresql.org/mailpref/pgadmin-support >>> >> >> > > > -- > *Akshay Joshi* > *Principal Software Engineer * > > > > *Phone: +91 20-3058-9517Mobile: +91 976-788-8246* >
diff --git a/pgadmin/include/schema/pgColumn.h b/pgadmin/include/schema/pgColumn.h index fca8456..9630794 100644 --- a/pgadmin/include/schema/pgColumn.h +++ b/pgadmin/include/schema/pgColumn.h @@ -15,6 +15,8 @@ // App headers #include "pgTable.h" +WX_DECLARE_STRING_HASH_MAP(wxString, inheritHashMap); + class pgCollection; class pgColumnFactory : public pgTableObjFactory diff --git a/pgadmin/schema/pgColumn.cpp b/pgadmin/schema/pgColumn.cpp index b3796e2..0e463cd 100644 --- a/pgadmin/schema/pgColumn.cpp +++ b/pgadmin/schema/pgColumn.cpp @@ -545,23 +545,43 @@ pgObject *pgColumnFactory::CreateObjects(pgCollection *coll, ctlTree *browser, c pgTableObjCollection *collection = (pgTableObjCollection *)coll; pgColumn *column = 0; pgDatabase *database = collection->GetDatabase(); - wxString sql; - int currentcol; - int currentlimit; + inheritHashMap inhMap; - // grab inherited tables - sql = wxT("SELECT inhparent::regclass AS inhrelname,\n") - wxT(" (SELECT count(*) FROM pg_attribute WHERE attrelid=inhparent AND attnum>0) AS colscount\n") - wxT(" FROM pg_inherits\n") - wxT(" WHERE inhrelid = ") + collection->GetOidStr() + wxT("::oid\n") - wxT(" ORDER BY inhseqno"); - pgSet *inhtables = database->ExecuteSet(sql); + // grab inherited tables with attibute names + pgSet *inhtables = database->ExecuteSet( + wxT("SELECT\n") + wxT(" array_to_string(array_agg(inhrelname), ', ') inhrelname,\n") + wxT(" attrname\n") + wxT("FROM\n") + wxT(" (SELECT\n") + wxT(" inhparent::regclass AS inhrelname,\n") + wxT(" a.attname AS attrname\n") + wxT(" FROM\n") + wxT(" pg_inherits i\n") + wxT(" LEFT JOIN pg_attribute a ON\n") + wxT(" (attrelid = inhparent AND attnum > 0)\n") + wxT(" WHERE inhrelid = ") + collection->GetOidStr() + wxT("::oid\n") + wxT(" ORDER BY inhseqno) a\n") + wxT("GROUP BY attrname")); + + if (inhtables) + { + while (!inhtables->Eof()) + { + wxString attrName = inhtables->GetVal(wxT("attrname")); + wxString inhrelName = inhtables->GetVal(wxT("inhrelname")); + inhMap[attrName] = inhrelName; + inhtables->MoveNext(); + } + + delete inhtables; + } wxString systemRestriction; if (!settings->GetShowSystemObjects()) systemRestriction = wxT("\n AND att.attnum > 0"); - sql = + wxString sql = wxT("SELECT att.*, def.*, pg_catalog.pg_get_expr(def.adbin, def.adrelid) AS defval, CASE WHEN att.attndims > 0 THEN 1 ELSE 0 END AS isarray, format_type(ty.oid,NULL) AS typname, format_type(ty.oid,att.atttypmod) AS displaytypname, tn.nspname as typnspname, et.typname as elemtypname,\n") wxT(" ty.typstorage AS defaultstorage, cl.relname, na.nspname, att.attstattarget, description, cs.relname AS sername, ns.nspname AS serschema,\n") wxT(" (SELECT count(1) FROM pg_type t2 WHERE t2.typname=ty.typname) > 1 AS isdup, indkey"); @@ -604,17 +624,10 @@ pgObject *pgColumnFactory::CreateObjects(pgCollection *coll, ctlTree *browser, c pgSet *columns = database->ExecuteSet(sql); if (columns) { - currentcol = 0; - if (inhtables && !inhtables->Eof()) - { - currentlimit = inhtables->GetLong(wxT("colscount")); - } while (!columns->Eof()) { - if (columns->GetLong(wxT("attnum")) > 0) // ignore system columns before inherited columns - currentcol++; - - column = new pgColumn(collection->GetTable(), columns->GetVal(wxT("attname"))); + wxString attrName = columns->GetVal(wxT("attname")); + column = new pgColumn(collection->GetTable(), attrName); column->iSetAttTypId(columns->GetOid(wxT("atttypid"))); column->iSetColNumber(columns->GetLong(wxT("attnum"))); @@ -665,18 +678,10 @@ pgObject *pgColumnFactory::CreateObjects(pgCollection *coll, ctlTree *browser, c column->iSetTableName(columns->GetVal(wxT("relname"))); column->iSetInheritedCount(columns->GetLong(wxT("attinhcount"))); - if (inhtables) - { - if (currentcol > currentlimit) - { - inhtables->MoveNext(); - if (!inhtables->Eof()) - currentlimit += inhtables->GetLong(wxT("colscount")); - } - - if (!inhtables->Eof()) - column->iSetInheritedTableName(inhtables->GetVal(wxT("inhrelname"))); - } + // Check whether the attribute is inherited + inheritHashMap::iterator it = inhMap.find(attrName); + if (it != inhMap.end()) + column->iSetInheritedTableName(it->second); column->iSetIsLocal(columns->GetBool(wxT("attislocal"))); column->iSetAttstattarget(columns->GetLong(wxT("attstattarget"))); @@ -711,9 +716,10 @@ pgObject *pgColumnFactory::CreateObjects(pgCollection *coll, ctlTree *browser, c break; } - delete inhtables; delete columns; } + + inhMap.clear(); return column; }
-- Sent via pgadmin-support mailing list (pgadmin-support@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-support