diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index df6045fc70e7d186f644c3f41d45f0b91ed326fd..7cfb12198890728e7003b7e77a40f4210b120315 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.451 2008/10/27 09:37:46 petere Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.452 2008/11/03 17:51:12 tgl Exp $ --> <chapter id="functions"> <title>Functions and Operators</title> @@ -11643,6 +11643,10 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); <primary>pg_tablespace_databases</primary> </indexterm> + <indexterm> + <primary>pg_typeof</primary> + </indexterm> + <para> <xref linkend="functions-info-catalog-table"> lists functions that extract information from the system catalogs. @@ -11766,6 +11770,11 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); <entry><type>setof oid</type></entry> <entry>get the set of database OIDs that have objects in the tablespace</entry> </row> + <row> + <entry><literal><function>pg_typeof</function>(<parameter>any</parameter>)</literal></entry> + <entry><type>regtype</type></entry> + <entry>get the data type of any value</entry> + </row> </tbody> </tgroup> </table> @@ -11848,6 +11857,12 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); <structname>pg_class</> catalogs. </para> + <para> + <function>pg_typeof</function> returns the OID of the data type of the + value that is passed to it. This can be helpful for troubleshooting or + dynamically constructing SQL queries. + </para> + <indexterm> <primary>col_description</primary> </indexterm> diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index a1bae80798a05facec20eebe18fb2da340d7a0ec..ab0f58158773f13f353b36d198a27f0dbd9de280 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.64 2008/10/05 17:33:16 petere Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.65 2008/11/03 17:51:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -371,3 +371,13 @@ pg_get_keywords(PG_FUNCTION_ARGS) SRF_RETURN_DONE(funcctx); } + + +/* + * Return the type of the argument. + */ +Datum +pg_typeof(PG_FUNCTION_ARGS) +{ + PG_RETURN_OID(get_fn_expr_argtype(fcinfo->flinfo, 0)); +} diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 3d0db7a461d172b6d4eae4218cb29355d2bd7e1d..c41fcb05701ecd53db6e205adeb661c923bea1a1 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -37,7 +37,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.500 2008/10/31 08:39:22 heikki Exp $ + * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.501 2008/11/03 17:51:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 200810311 +#define CATALOG_VERSION_NO 200811031 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 9867f44f27357b3042732e86c62b472455a5a111..86a8e3f2735c8d201b66203164e8f29a922a35f7 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.520 2008/10/14 17:12:33 tgl Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.521 2008/11/03 17:51:13 tgl Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -2289,7 +2289,8 @@ DESCR("result type of a function"); DATA(insert OID = 1686 ( pg_get_keywords PGNSP PGUID 12 10 400 0 f f t t s 0 2249 "" "{25,18,25}" "{o,o,o}" "{word,catcode,catdesc}" pg_get_keywords _null_ _null_ _null_ )); DESCR("list of SQL keywords"); - +DATA(insert OID = 1619 ( pg_typeof PGNSP PGUID 12 1 0 0 f f f f i 1 2206 "2276" _null_ _null_ _null_ pg_typeof _null_ _null_ _null_ )); +DESCR("returns the type of the argument"); /* Generic referential integrity constraint triggers */ DATA(insert OID = 1644 ( RI_FKey_check_ins PGNSP PGUID 12 1 0 0 f f t f v 0 2279 "" _null_ _null_ _null_ RI_FKey_check_ins _null_ _null_ _null_ )); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index b9efbe88b33ce1827a1462c5999b23685e4106ad..c594e5f2e6123eda32e7950ddb1d161f53dec1dc 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.324 2008/10/13 16:25:20 tgl Exp $ + * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.325 2008/11/03 17:51:13 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -404,6 +404,7 @@ extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS); extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS); extern Datum pg_sleep(PG_FUNCTION_ARGS); extern Datum pg_get_keywords(PG_FUNCTION_ARGS); +extern Datum pg_typeof(PG_FUNCTION_ARGS); /* oid.c */ extern Datum oidin(PG_FUNCTION_ARGS); diff --git a/src/test/regress/expected/polymorphism.out b/src/test/regress/expected/polymorphism.out index 3779f8e58ce20f52e324d70acc9f1d7e0a99891a..6ddd3410ca92f7f9bdaf96b21ed76497e9d49aaa 100644 --- a/src/test/regress/expected/polymorphism.out +++ b/src/test/regress/expected/polymorphism.out @@ -721,3 +721,58 @@ LINE 1: select formarray(1, variadic array['x'::text]); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. drop function formarray(anyelement, variadic anyarray); +-- test pg_typeof() function +select pg_typeof(null); -- unknown + pg_typeof +----------- + unknown +(1 row) + +select pg_typeof(0); -- integer + pg_typeof +----------- + integer +(1 row) + +select pg_typeof(0.0); -- numeric + pg_typeof +----------- + numeric +(1 row) + +select pg_typeof(1+1 = 2); -- boolean + pg_typeof +----------- + boolean +(1 row) + +select pg_typeof('x'); -- unknown + pg_typeof +----------- + unknown +(1 row) + +select pg_typeof('' || ''); -- text + pg_typeof +----------- + text +(1 row) + +select pg_typeof(pg_typeof(0)); -- regtype + pg_typeof +----------- + regtype +(1 row) + +select pg_typeof(array[1.2,55.5]); -- numeric[] + pg_typeof +----------- + numeric[] +(1 row) + +select pg_typeof(myleast(10, 1, 20, 33)); -- polymorphic input + pg_typeof +----------- + integer +(1 row) + diff --git a/src/test/regress/sql/polymorphism.sql b/src/test/regress/sql/polymorphism.sql index a4e2b2da3e3ae8ce2b24db974cade79e05b3ee47..72377053538367c4c7ddb37fce81b1fc3e3db0ff 100644 --- a/src/test/regress/sql/polymorphism.sql +++ b/src/test/regress/sql/polymorphism.sql @@ -469,3 +469,14 @@ select formarray(1, 'x'::text); -- fail, type mismatch select formarray(1, variadic array['x'::text]); -- fail, type mismatch drop function formarray(anyelement, variadic anyarray); + +-- test pg_typeof() function +select pg_typeof(null); -- unknown +select pg_typeof(0); -- integer +select pg_typeof(0.0); -- numeric +select pg_typeof(1+1 = 2); -- boolean +select pg_typeof('x'); -- unknown +select pg_typeof('' || ''); -- text +select pg_typeof(pg_typeof(0)); -- regtype +select pg_typeof(array[1.2,55.5]); -- numeric[] +select pg_typeof(myleast(10, 1, 20, 33)); -- polymorphic input