WITH short_chars AS (SELECT table_schema, table_name, column_name, ordinal_position, data_type
FROM INFORMATION_SCHEMA.columns
WHERE (table_schema, table_name) IN (SELECT table_schema, table_name
FROM INFORMATION_SCHEMA.tables WHERE table_type='BASE TABLE') AND
table_schema NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL) AND data_type = 'character' AND
character_maximum_length=1),
short_varchars AS (SELECT table_schema, table_name, column_name, ordinal_position, data_type
FROM INFORMATION_SCHEMA.columns
WHERE (table_schema, table_name) IN (SELECT table_schema, table_name
FROM INFORMATION_SCHEMA.tables WHERE table_type='BASE TABLE') AND
table_schema NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL) AND data_type = 'character varying' AND
character_maximum_length=1),
all_cols AS (SELECT table_schema, table_name, column_name, ordinal_position, data_type
FROM short_chars
UNION SELECT table_schema, table_name, column_name, ordinal_position, data_type
FROM short_varchars)
SELECT table_schema, table_name, column_name, data_type
FROM all_cols
WHERE EXISTS (SELECT * FROM short_chars)
AND EXISTS (SELECT * FROM short_varchars)
ORDER BY data_type, table_schema, table_name, ordinal_position;