X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (av.hub.org [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 095EF528D7 for ; Thu, 18 Aug 2005 17:39:13 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 24454-08 for ; Thu, 18 Aug 2005 20:39:10 +0000 (GMT) Received: from web51906.mail.yahoo.com (web51906.mail.yahoo.com [206.190.48.69]) by svr1.postgresql.org (Postfix) with SMTP id 885BE52899 for ; Thu, 18 Aug 2005 17:39:08 -0300 (ADT) Received: (qmail 3981 invoked by uid 60001); 18 Aug 2005 20:39:09 -0000 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=Message-ID:Received:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding; b=f8BfEaYLcxV4JEbovjJS8exLOPPd4CibEUc5od0Qn58pNq76g3/D53clV0+3KAwyY2WhEEYBaoOLalU0AxQf4bcIEiIRm/Q/QQQS7pHhOSxNARBFpg9syqh3ogePuVD7gAu+38UNggrne++H4ReUBBES69WfIIGJiQZIDK9nZNs= ; Message-ID: <20050818203909.3979.qmail@web51906.mail.yahoo.com> Received: from [80.84.139.163] by web51906.mail.yahoo.com via HTTP; Thu, 18 Aug 2005 13:39:09 PDT Date: Thu, 18 Aug 2005 13:39:09 -0700 (PDT) From: Roger Tannous Subject: Re: A Table's Primary Key Listing To: Tom Lane , "D'Arcy J.M. Cain" Cc: Roger Tannous , pgsql-sql@postgresql.org In-Reply-To: <10279.1124395722@sss.pgh.pa.us> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.36 required=5 tests=[AWL=-0.014, DNS_FROM_RFC_ABUSE=0.374] X-Spam-Level: X-Archive-Number: 200508/151 X-Sequence-Number: 22379 Hi, If you put pg_index.indkey in the select statement, you'd notice that it's sometimes 1 ( it's when we have one PK field) and sometimes 1 2 ( for two PK fields), etc. So I tried to use a replace command like the following: (just to add parentheses, replace the space by a comma to use the resulting string in an IN statement) select '(' || replace('1 2', " ", ",") || ')'; which yields: (1,2) But the following query fails to execute!! select replace(indkey, " ", ",") from pg_index; [ sub question: Did I miss quotes around elements? I mean should I enclose every element originating from the indkey array with single quotes ? if yes, so easy, no need to matter about it: so I should have tried the following (which I didn't have time to do yet): select '(\'' || replace(indkey, " ", "','") || '\')' from pg_index; Another issue here too: Could double quotes here be the source of a problem ? So I should have tested also this query: select '(\'' || replace(indkey, ' ', '\',\'') || '\')' from pg_index; I expect this query to work :) Let's hope so!! ] So we can use the following WHERE statement: WHERE pg_attribute.attnum IN '(' || replace('1 2', " ", ",") || ')' which should translate into: WHERE pg_attribute.attnum IN (1,2) Finally, this WHERE statement: WHERE pg_attribute.attnum IN '(\'' || replace(pg_index.indkey, " ", "','") || '\')' [ Again, I should test: WHERE pg_attribute.attnum IN '(\'' || replace(pg_index.indkey, ' ', '\',\'') || '\')' ] I wish I had database access in the internet cafe I'm sending this message from :) instead of just loading you with this bunch of questions. Best Regards, Roger Tannous. --- Tom Lane wrote: > "D'Arcy J.M. Cain" writes: > > That's a good question. The following query does this in a very > > unsatisfactory way. Anyone know what the general solution would be? > > > ... > > ( > > pg_index.indkey[0]=pg_attribute.attnum OR > > pg_index.indkey[1]=pg_attribute.attnum OR > > pg_index.indkey[2]=pg_attribute.attnum OR > > pg_index.indkey[3]=pg_attribute.attnum OR > > pg_index.indkey[4]=pg_attribute.attnum OR > > pg_index.indkey[5]=pg_attribute.attnum OR > > pg_index.indkey[6]=pg_attribute.attnum OR > > pg_index.indkey[7]=pg_attribute.attnum OR > > pg_index.indkey[8]=pg_attribute.attnum OR > > pg_index.indkey[9]=pg_attribute.attnum > > ) > > In CVS tip you could replace this with "attnum = ANY (indkey)". > Unfortunately, most array support doesn't work on int2vector in > pre-8.1 releases, so I think you're kinda stuck with the above > for now. > > regards, tom lane > ____________________________________________________ Start your day with Yahoo! - make it your home page http://www.yahoo.com/r/hs