SELECT
T.schemaname AS schemaName
,T.relname AS tableName
,CL.relname AS indexName
,IDX.index_no AS columnNo
,A.attname AS columnName
,C.udt_name AS columnType
,CASE
WHEN C.udt_name = 'numeric'
THEN C.numeric_precision_radix || ',' || C.numeric_scale
ELSE C.character_maximum_length || ''
END AS columnLength
,C.is_nullable AS isNull
,C.column_default AS columnDefault
,D.description AS description
FROM pg_stat_user_tables T
INNER JOIN (
SELECT UNNEST(array[indkey]) AS index_no, T.* FROM pg_index T
) IDX ON IDX.indrelid = T.relid
INNER JOIN pg_class CL
ON CL.oid = IDX.indexrelid
INNER JOIN pg_attribute A
ON A.attrelid = IDX.indrelid
AND A.attnum = IDX.index_no
INNER JOIN information_schema.COLUMNS C
ON C.table_schema = T.schemaname
AND C.table_name = T.relname
AND C.column_name = A.attname
LEFT JOIN pg_catalog.pg_description D
ON D.objoid = T.relid
AND D.objsubid = A.attnum
ORDER BY T.schemaname, T.relname,CL.relname,IDX.index_no;