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
--
[EMAIL PROTECTED]
Alex J. Avriette, Professional Something-or-Other
"Premature optimization is the root of all evil! BAD PROGRAMMER! No COOKIE!!!" -
Mark-Jason Dominus
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly