Re: Does included columns part of the PK

Adrian Klaver <adrian.klaver@aklaver.com>

From: Adrian Klaver <adrian.klaver@aklaver.com>
To: Igor Korot <ikorot01@gmail.com>, "David G. Johnston" <david.g.johnston@gmail.com>, "pgsql-generallists.postgresql.org" <pgsql-general@lists.postgresql.org>
Date: 2026-03-14T23:30:19Z
Lists: pgsql-general
On 3/14/26 9:56 AM, Igor Korot wrote:
> Hi,
> 
> On Sat, Mar 14, 2026 at 8:51 AM David G. Johnston 
> <david.g.johnston@gmail.com <mailto:david.g.johnston@gmail.com>> wrote:
> 
>     On Saturday, March 14, 2026, Adrian Klaver
>     <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> wrote:
> 
>         On 3/14/26 12:09 AM, Igor Korot wrote:
> 
>             Hi, ALL,
>             Have one weird question ;-)
> 
>             When I connect with ODBC and call SQLPrimaryKey() the
>             function returns
> 
> 
>         Are you actually using the SQLPrimaryKeys(), not SQLPrimaryKey()?
> 
>             all fields including
>             "included" fields.
> 
> 
>         Define 'included' fields.
> 
> 
>     They are referring to the unique index that backs the PK constraint.
> 
> 
> Not “they” - “He”. 😊
> 
> And yes - that’s what I’m referring to.

 From here:


https://www.ibm.com/docs/en/db2-for-zos/12.0.0?topic=functions-sqlprimarykeys-get-primary-key-columns-table:

1	TABLE_CAT	VARCHAR(128)	This is always null.
2	TABLE_SCHEM	VARCHAR(128)	The name of the schema containing TABLE_NAME.
3	TABLE_NAME	VARCHAR(128) NOT NULL	Name of the specified table.
4	COLUMN_NAME	VARCHAR(128) NOT NULL	Primary key column name.
5	KEY_SEQ	SMALLINT NOT NULL	Column sequence number in the primary key, 
starting with 1.
6	PK_NAME	VARCHAR(128)	Primary key identifier. Contains a null value if 
not applicable to the data


 From here:

https://github.com/postgresql-interfaces/psqlodbc/blob/main/info.c

At line 4035 in SQLPrimaryKeys()

For case 1

/*
				 * Simplified query to remove assumptions about number of
				 * possible index columns. Courtesy of Tom Lane - thomas
				 * 2000-03-21
				 */

[...]

"select ta.attname, ia.attnum, ic.relname, n.nspname, tc.relname"
					" from pg_catalog.pg_attribute ta ... "


case 2

select ta.attname, ia.attnum, ic.relname, n.nspname, NULL"
					" from pg_catalog.pg_attribute ta, ..."

If I am following correctly then:

attname = column_name
attnum = key_seq
ic.relname = pk_name
nspname = table_schem
tc.relname = table_name


So how are using it in your code and what are the actual results?

Also what is showing up in the Postgres logs?

> 
> Thank you.
> 
> 
>     David J.
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com