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;