feature request: \qf datatype

From: "Alex J(dot) Avriette" <alex(at)posixnap(dot)net>
To: pgsql-hackers(at)postgresql(dot)org
Subject: feature request: \qf datatype
Date: 2003-12-25 17:59:33
Message-ID: 20031225175933.GE21189@posixnap.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

I'd like to request the following feature:

Frequently when answering questions on IRC for people, questions fall
into one of two categories, "what function can I use to manipulate
datatype xyz," and "what datatype can i use for xyz."

The latter is harder to answer than the former. For the former, I
propose a macro in psql, "\qf" (query function). Obviously, the name
implies a broader scope than simply querying the datatypes
permissable.

I foresee something like this (sorry, this has a lot of output):

dbms=> \qf timestamp

Name | Result data type | Argument data types
---------------------+-----------------------------+--------------------------------------------------------------------------------------------------------------------
abstime | abstime | timestamp with time zone
abstime | abstime | timestamp without time zone
isfinite | boolean | timestamp with time zone
isfinite | boolean | timestamp without time zone
overlaps | boolean | timestamp with time zone, interval, timestamp with time zone, interval
overlaps | boolean | timestamp with time zone, interval, timestamp with time zone, timestamp with time zone
overlaps | boolean | timestamp with time zone, timestamp with time zone, timestamp with time zone, interval
overlaps | boolean | timestamp with time zone, timestamp with time zone, timestamp with time zone, timestamp with time zone
overlaps | boolean | timestamp without time zone, interval, timestamp without time zone, interval
overlaps | boolean | timestamp without time zone, interval, timestamp without time zone, timestamp without time zone
overlaps | boolean | timestamp without time zone, timestamp without time zone, timestamp without time zone, interval
overlaps | boolean | timestamp without time zone, timestamp without time zone, timestamp without time zone, timestamp without time zone
timestamp_eq | boolean | timestamp without time zone, timestamp without time zone
timestamp_ge | boolean | timestamp without time zone, timestamp without time zone
timestamp_gt | boolean | timestamp without time zone, timestamp without time zone
timestamp_le | boolean | timestamp without time zone, timestamp without time zone
timestamp_lt | boolean | timestamp without time zone, timestamp without time zone
timestamp_ne | boolean | timestamp without time zone, timestamp without time zone
timestamptz_eq | boolean | timestamp with time zone, timestamp with time zone
timestamptz_ge | boolean | timestamp with time zone, timestamp with time zone
timestamptz_gt | boolean | timestamp with time zone, timestamp with time zone
timestamptz_le | boolean | timestamp with time zone, timestamp with time zone
timestamptz_lt | boolean | timestamp with time zone, timestamp with time zone
timestamptz_ne | boolean | timestamp with time zone, timestamp with time zone
date | date | timestamp with time zone
date | date | timestamp without time zone
date_part | double precision | text, timestamp with time zone
date_part | double precision | text, timestamp without time zone
timestamp_cmp | integer | timestamp without time zone, timestamp without time zone
timestamptz_cmp | integer | timestamp with time zone, timestamp with time zone
age | interval | timestamp with time zone
age | interval | timestamp with time zone, timestamp with time zone
age | interval | timestamp without time zone
age | interval | timestamp without time zone, timestamp without time zone
timestamp_mi | interval | timestamp without time zone, timestamp without time zone
timestamptz_mi | interval | timestamp with time zone, timestamp with time zone
timezone | interval | interval, timestamp with time zone
text | text | timestamp with time zone
text | text | timestamp without time zone
to_char | text | timestamp with time zone, text
to_char | text | timestamp without time zone, text
timetz | time with time zone | timestamp with time zone
time | time without time zone | timestamp with time zone
time | time without time zone | timestamp without time zone
date_trunc | timestamp with time zone | text, timestamp with time zone
timestamptz | timestamp with time zone | timestamp with time zone, integer
timestamptz | timestamp with time zone | timestamp without time zone
timestamptz_larger | timestamp with time zone | timestamp with time zone, timestamp with time zone
timestamptz_mi_span | timestamp with time zone | timestamp with time zone, interval
timestamptz_pl_span | timestamp with time zone | timestamp with time zone, interval
timestamptz_smaller | timestamp with time zone | timestamp with time zone, timestamp with time zone
timezone | timestamp with time zone | interval, timestamp without time zone
timezone | timestamp with time zone | text, timestamp without time zone
date_trunc | timestamp without time zone | text, timestamp without time zone
timestamp | timestamp without time zone | timestamp with time zone
timestamp | timestamp without time zone | timestamp without time zone, integer
timestamp_larger | timestamp without time zone | timestamp without time zone, timestamp without time zone
timestamp_mi_span | timestamp without time zone | timestamp without time zone, interval
timestamp_pl_span | timestamp without time zone | timestamp without time zone, interval
timestamp_smaller | timestamp without time zone | timestamp without time zone, timestamp without time zone
timezone | timestamp without time zone | text, timestamp with time zone
(61 rows)

The sql required to generate that is as follows:

SELECT CASE WHEN p.proretset THEN 'setof ' ELSE '' END ||
p.proname as "Name",
pg_catalog.format_type(p.prorettype, NULL) as "Result data type",
pg_catalog.oidvectortypes(p.proargtypes) as "Argument data types"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE p.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
AND p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype
AND NOT p.proisagg
AND pg_catalog.pg_function_is_visible(p.oid)
AND pg_catalog.oidvectortypes(p.proargtypes) ~ 'timestamp'
ORDER BY 2, 1, 3;

I looked in src/bin/psql/describe.c, and even found the \df macro.
However, the C stuff was beyond my ability. Hopefully, this is a direct
"clone \df" item. I really think this would be useful for people who
haven't yet becomes familiar with postgres' (very rich) function base.

Hm. On second thought, \qf is a bad name for it, as \q is quit, and 'f'
is an unexpected "extra argument." Perhaps \dfq?

Thanks,
alex

--
alex(at)posixnap(dot)net
Alex J. Avriette, Professional Something-or-Other
"Premature optimization is the root of all evil! BAD PROGRAMMER! No COOKIE!!!" - Mark-Jason Dominus

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Christian Kienle 2003-12-25 22:15:21 Photos of PostgreSQL booth
Previous Message Jan Wieck 2003-12-25 16:36:09 Re: PostgreSQL port to pure Java?