Add pg_typeof() function.
authorTom Lane
Mon, 3 Nov 2008 17:51:13 +0000 (17:51 +0000)
committerTom Lane
Mon, 3 Nov 2008 17:51:13 +0000 (17:51 +0000)
Brendan Jurd

doc/src/sgml/func.sgml
src/backend/utils/adt/misc.c
src/include/catalog/catversion.h
src/include/catalog/pg_proc.h
src/include/utils/builtins.h
src/test/regress/expected/polymorphism.out
src/test/regress/sql/polymorphism.sql

index df6045fc70e7d186f644c3f41d45f0b91ed326fd..7cfb12198890728e7003b7e77a40f4210b120315 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
  
   Functions and Operators
@@ -11643,6 +11643,10 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
     pg_tablespace_databases
    
 
+   
+    pg_typeof
+   
+
   
     lists functions that
    extract information from the system catalogs.
@@ -11766,6 +11770,11 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
        setof oid
        get the set of database OIDs that have objects in the tablespace
       
+      
+       pg_typeof(any)
+       regtype
+       get the data type of any value
+      
      
     
    
@@ -11848,6 +11857,12 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
    pg_class catalogs.
   
 
+  
+   pg_typeof 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.
+  
+
    
     col_description
    
index a1bae80798a05facec20eebe18fb2da340d7a0ec..ab0f58158773f13f353b36d198a27f0dbd9de280 100644 (file)
@@ -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));
+}
index 3d0db7a461d172b6d4eae4218cb29355d2bd7e1d..c41fcb05701ecd53db6e205adeb661c923bea1a1 100644 (file)
@@ -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
index 9867f44f27357b3042732e86c62b472455a5a111..86a8e3f2735c8d201b66203164e8f29a922a35f7 100644 (file)
@@ -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_ ));
index b9efbe88b33ce1827a1462c5999b23685e4106ad..c594e5f2e6123eda32e7950ddb1d161f53dec1dc 100644 (file)
@@ -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);
index 3779f8e58ce20f52e324d70acc9f1d7e0a99891a..6ddd3410ca92f7f9bdaf96b21ed76497e9d49aaa 100644 (file)
@@ -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)
+
index a4e2b2da3e3ae8ce2b24db974cade79e05b3ee47..72377053538367c4c7ddb37fce81b1fc3e3db0ff 100644 (file)
@@ -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