Commit dfc0219f authored by Robert Haas's avatar Robert Haas

Add to_regprocedure() and to_regoperator().

These are natural complements to the functions added by commit
0886fc6a, but they weren't included
in the original patch for some reason.  Add them.

Patch by me, per a complaint by Tom Lane.  Review by Tatsuo
Ishii.
parent 1a81daab
...@@ -15293,10 +15293,18 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); ...@@ -15293,10 +15293,18 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
<primary>to_regproc</primary> <primary>to_regproc</primary>
</indexterm> </indexterm>
<indexterm>
<primary>to_regprocedure</primary>
</indexterm>
<indexterm> <indexterm>
<primary>to_regoper</primary> <primary>to_regoper</primary>
</indexterm> </indexterm>
<indexterm>
<primary>to_regoperator</primary>
</indexterm>
<indexterm> <indexterm>
<primary>to_regtype</primary> <primary>to_regtype</primary>
</indexterm> </indexterm>
...@@ -15481,11 +15489,21 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); ...@@ -15481,11 +15489,21 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
<entry><type>regproc</type></entry> <entry><type>regproc</type></entry>
<entry>get the oid of the named function</entry> <entry>get the oid of the named function</entry>
</row> </row>
<row>
<entry><literal><function>to_regprocedure(<parameter>func_name</parameter>)</function></literal></entry>
<entry><type>regprocedure</type></entry>
<entry>get the oid of the named function</entry>
</row>
<row> <row>
<entry><literal><function>to_regoper(<parameter>operator_name</parameter>)</function></literal></entry> <entry><literal><function>to_regoper(<parameter>operator_name</parameter>)</function></literal></entry>
<entry><type>regoper</type></entry> <entry><type>regoper</type></entry>
<entry>get the oid of the named operator</entry> <entry>get the oid of the named operator</entry>
</row> </row>
<row>
<entry><literal><function>to_regoperator(<parameter>operator_name</parameter>)</function></literal></entry>
<entry><type>regoperator</type></entry>
<entry>get the oid of the named operator</entry>
</row>
<row> <row>
<entry><literal><function>to_regtype(<parameter>type_name</parameter>)</function></literal></entry> <entry><literal><function>to_regtype(<parameter>type_name</parameter>)</function></literal></entry>
<entry><type>regtype</type></entry> <entry><type>regtype</type></entry>
...@@ -15658,10 +15676,12 @@ SELECT collation for ('foo' COLLATE "de_DE"); ...@@ -15658,10 +15676,12 @@ SELECT collation for ('foo' COLLATE "de_DE");
<para> <para>
The <function>to_regclass</function>, <function>to_regproc</function>, The <function>to_regclass</function>, <function>to_regproc</function>,
<function>to_regoper</function> and <function>to_regtype</function> <function>to_regprocedure</function>, <function>to_regoper</function>,
translate relation, function, operator, and type names to objects of <function>to_regoperator</function>, and <function>to_regtype</function>
type <type>regclass</>, <type>regproc</>, <type>regoper</> and functions translate relation, function, operator, and type names to objects
<type>regtype</>, respectively. These functions differ from a cast from of type <type>regclass</>, <type>regproc</>, <type>regprocedure</type>,
<type>regoper</>, <type>regoperator</type>, and <type>regtype</>,
respectively. These functions differ from a cast from
text in that they don't accept a numeric OID, and that they return null text in that they don't accept a numeric OID, and that they return null
rather than throwing an error if the name is not found (or, for rather than throwing an error if the name is not found (or, for
<function>to_regproc</function> and <function>to_regoper</function>, if <function>to_regproc</function> and <function>to_regoper</function>, if
......
...@@ -322,6 +322,38 @@ regprocedurein(PG_FUNCTION_ARGS) ...@@ -322,6 +322,38 @@ regprocedurein(PG_FUNCTION_ARGS)
PG_RETURN_OID(result); PG_RETURN_OID(result);
} }
/*
* to_regprocedure - converts "proname(args)" to proc OID
*
* If the name is not found, we return NULL.
*/
Datum
to_regprocedure(PG_FUNCTION_ARGS)
{
char *pro_name = PG_GETARG_CSTRING(0);
List *names;
int nargs;
Oid argtypes[FUNC_MAX_ARGS];
FuncCandidateList clist;
/*
* Parse the name and arguments, look up potential matches in the current
* namespace search list, and scan to see which one exactly matches the
* given argument types. (There will not be more than one match.)
*/
parseNameAndArgTypes(pro_name, false, &names, &nargs, argtypes);
clist = FuncnameGetCandidates(names, nargs, NIL, false, false, true);
for (; clist; clist = clist->next)
{
if (memcmp(clist->args, argtypes, nargs * sizeof(Oid)) == 0)
PG_RETURN_OID(clist->oid);
}
PG_RETURN_NULL();
}
/* /*
* format_procedure - converts proc OID to "pro_name(args)" * format_procedure - converts proc OID to "pro_name(args)"
* *
...@@ -721,6 +753,45 @@ regoperatorin(PG_FUNCTION_ARGS) ...@@ -721,6 +753,45 @@ regoperatorin(PG_FUNCTION_ARGS)
PG_RETURN_OID(result); PG_RETURN_OID(result);
} }
/*
* to_regoperator - converts "oprname(args)" to operator OID
*
* If the name is not found, we return NULL.
*/
Datum
to_regoperator(PG_FUNCTION_ARGS)
{
char *opr_name_or_oid = PG_GETARG_CSTRING(0);
Oid result;
List *names;
int nargs;
Oid argtypes[FUNC_MAX_ARGS];
/*
* Parse the name and arguments, look up potential matches in the current
* namespace search list, and scan to see which one exactly matches the
* given argument types. (There will not be more than one match.)
*/
parseNameAndArgTypes(opr_name_or_oid, true, &names, &nargs, argtypes);
if (nargs == 1)
ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_PARAMETER),
errmsg("missing argument"),
errhint("Use NONE to denote the missing argument of a unary operator.")));
if (nargs != 2)
ereport(ERROR,
(errcode(ERRCODE_TOO_MANY_ARGUMENTS),
errmsg("too many arguments"),
errhint("Provide two argument types for operator.")));
result = OpernameGetOprid(names, argtypes[0], argtypes[1]);
if (!OidIsValid(result))
PG_RETURN_NULL();
PG_RETURN_OID(result);
}
/* /*
* format_operator - converts operator OID to "opr_name(args)" * format_operator - converts operator OID to "opr_name(args)"
* *
......
...@@ -53,6 +53,6 @@ ...@@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 201404123 #define CATALOG_VERSION_NO 201404161
#endif #endif
...@@ -175,6 +175,8 @@ DATA(insert OID = 45 ( regprocout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 ...@@ -175,6 +175,8 @@ DATA(insert OID = 45 ( regprocout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 3494 ( to_regproc PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 24 "2275" _null_ _null_ _null_ _null_ to_regproc _null_ _null_ _null_ )); DATA(insert OID = 3494 ( to_regproc PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 24 "2275" _null_ _null_ _null_ _null_ to_regproc _null_ _null_ _null_ ));
DESCR("convert proname to regproc"); DESCR("convert proname to regproc");
DATA(insert OID = 3479 ( to_regprocedure PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2202 "2275" _null_ _null_ _null_ _null_ to_regprocedure _null_ _null_ _null_ ));
DESCR("convert proname to regprocedure");
DATA(insert OID = 46 ( textin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "2275" _null_ _null_ _null_ _null_ textin _null_ _null_ _null_ )); DATA(insert OID = 46 ( textin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "2275" _null_ _null_ _null_ _null_ textin _null_ _null_ _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 47 ( textout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "25" _null_ _null_ _null_ _null_ textout _null_ _null_ _null_ )); DATA(insert OID = 47 ( textout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "25" _null_ _null_ _null_ _null_ textout _null_ _null_ _null_ ));
...@@ -3351,6 +3353,8 @@ DATA(insert OID = 2215 ( regoperout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2 ...@@ -3351,6 +3353,8 @@ DATA(insert OID = 2215 ( regoperout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 3492 ( to_regoper PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2203 "2275" _null_ _null_ _null_ _null_ to_regoper _null_ _null_ _null_ )); DATA(insert OID = 3492 ( to_regoper PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2203 "2275" _null_ _null_ _null_ _null_ to_regoper _null_ _null_ _null_ ));
DESCR("convert operator name to regoper"); DESCR("convert operator name to regoper");
DATA(insert OID = 3476 ( to_regoperator PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2204 "2275" _null_ _null_ _null_ _null_ to_regoperator _null_ _null_ _null_ ));
DESCR("convert operator name to regoperator");
DATA(insert OID = 2216 ( regoperatorin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2204 "2275" _null_ _null_ _null_ _null_ regoperatorin _null_ _null_ _null_ )); DATA(insert OID = 2216 ( regoperatorin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2204 "2275" _null_ _null_ _null_ _null_ regoperatorin _null_ _null_ _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2217 ( regoperatorout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2204" _null_ _null_ _null_ _null_ regoperatorout _null_ _null_ _null_ )); DATA(insert OID = 2217 ( regoperatorout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2204" _null_ _null_ _null_ _null_ regoperatorout _null_ _null_ _null_ ));
......
...@@ -602,6 +602,7 @@ extern char *regexp_fixed_prefix(text *text_re, bool case_insensitive, ...@@ -602,6 +602,7 @@ extern char *regexp_fixed_prefix(text *text_re, bool case_insensitive,
extern Datum regprocin(PG_FUNCTION_ARGS); extern Datum regprocin(PG_FUNCTION_ARGS);
extern Datum regprocout(PG_FUNCTION_ARGS); extern Datum regprocout(PG_FUNCTION_ARGS);
extern Datum to_regproc(PG_FUNCTION_ARGS); extern Datum to_regproc(PG_FUNCTION_ARGS);
extern Datum to_regprocedure(PG_FUNCTION_ARGS);
extern Datum regprocrecv(PG_FUNCTION_ARGS); extern Datum regprocrecv(PG_FUNCTION_ARGS);
extern Datum regprocsend(PG_FUNCTION_ARGS); extern Datum regprocsend(PG_FUNCTION_ARGS);
extern Datum regprocedurein(PG_FUNCTION_ARGS); extern Datum regprocedurein(PG_FUNCTION_ARGS);
...@@ -613,6 +614,7 @@ extern Datum regoperout(PG_FUNCTION_ARGS); ...@@ -613,6 +614,7 @@ extern Datum regoperout(PG_FUNCTION_ARGS);
extern Datum regoperrecv(PG_FUNCTION_ARGS); extern Datum regoperrecv(PG_FUNCTION_ARGS);
extern Datum regopersend(PG_FUNCTION_ARGS); extern Datum regopersend(PG_FUNCTION_ARGS);
extern Datum to_regoper(PG_FUNCTION_ARGS); extern Datum to_regoper(PG_FUNCTION_ARGS);
extern Datum to_regoperator(PG_FUNCTION_ARGS);
extern Datum regoperatorin(PG_FUNCTION_ARGS); extern Datum regoperatorin(PG_FUNCTION_ARGS);
extern Datum regoperatorout(PG_FUNCTION_ARGS); extern Datum regoperatorout(PG_FUNCTION_ARGS);
extern Datum regoperatorrecv(PG_FUNCTION_ARGS); extern Datum regoperatorrecv(PG_FUNCTION_ARGS);
......
...@@ -9,12 +9,24 @@ SELECT regoper('||/'); ...@@ -9,12 +9,24 @@ SELECT regoper('||/');
||/ ||/
(1 row) (1 row)
SELECT regoperator('+(int4,int4)');
regoperator
--------------------
+(integer,integer)
(1 row)
SELECT regproc('now'); SELECT regproc('now');
regproc regproc
--------- ---------
now now
(1 row) (1 row)
SELECT regprocedure('abs(numeric)');
regprocedure
--------------
abs(numeric)
(1 row)
SELECT regclass('pg_class'); SELECT regclass('pg_class');
regclass regclass
---------- ----------
...@@ -33,12 +45,24 @@ SELECT to_regoper('||/'); ...@@ -33,12 +45,24 @@ SELECT to_regoper('||/');
||/ ||/
(1 row) (1 row)
SELECT to_regoperator('+(int4,int4)');
to_regoperator
--------------------
+(integer,integer)
(1 row)
SELECT to_regproc('now'); SELECT to_regproc('now');
to_regproc to_regproc
------------ ------------
now now
(1 row) (1 row)
SELECT to_regprocedure('abs(numeric)');
to_regprocedure
-----------------
abs(numeric)
(1 row)
SELECT to_regclass('pg_class'); SELECT to_regclass('pg_class');
to_regclass to_regclass
------------- -------------
...@@ -58,12 +82,24 @@ SELECT regoper('pg_catalog.||/'); ...@@ -58,12 +82,24 @@ SELECT regoper('pg_catalog.||/');
||/ ||/
(1 row) (1 row)
SELECT regoperator('pg_catalog.+(int4,int4)');
regoperator
--------------------
+(integer,integer)
(1 row)
SELECT regproc('pg_catalog.now'); SELECT regproc('pg_catalog.now');
regproc regproc
--------- ---------
now now
(1 row) (1 row)
SELECT regprocedure('pg_catalog.abs(numeric)');
regprocedure
--------------
abs(numeric)
(1 row)
SELECT regclass('pg_catalog.pg_class'); SELECT regclass('pg_catalog.pg_class');
regclass regclass
---------- ----------
...@@ -88,6 +124,12 @@ SELECT to_regproc('pg_catalog.now'); ...@@ -88,6 +124,12 @@ SELECT to_regproc('pg_catalog.now');
now now
(1 row) (1 row)
SELECT to_regprocedure('pg_catalog.abs(numeric)');
to_regprocedure
-----------------
abs(numeric)
(1 row)
SELECT to_regclass('pg_catalog.pg_class'); SELECT to_regclass('pg_catalog.pg_class');
to_regclass to_regclass
------------- -------------
...@@ -106,10 +148,18 @@ SELECT regoper('||//'); ...@@ -106,10 +148,18 @@ SELECT regoper('||//');
ERROR: operator does not exist: ||// ERROR: operator does not exist: ||//
LINE 3: SELECT regoper('||//'); LINE 3: SELECT regoper('||//');
^ ^
SELECT regoperator('++(int4,int4)');
ERROR: operator does not exist: ++(int4,int4)
LINE 1: SELECT regoperator('++(int4,int4)');
^
SELECT regproc('know'); SELECT regproc('know');
ERROR: function "know" does not exist ERROR: function "know" does not exist
LINE 1: SELECT regproc('know'); LINE 1: SELECT regproc('know');
^ ^
SELECT regprocedure('absinthe(numeric)');
ERROR: function "absinthe(numeric)" does not exist
LINE 1: SELECT regprocedure('absinthe(numeric)');
^
SELECT regclass('pg_classes'); SELECT regclass('pg_classes');
ERROR: relation "pg_classes" does not exist ERROR: relation "pg_classes" does not exist
LINE 1: SELECT regclass('pg_classes'); LINE 1: SELECT regclass('pg_classes');
...@@ -123,10 +173,18 @@ SELECT regoper('ng_catalog.||/'); ...@@ -123,10 +173,18 @@ SELECT regoper('ng_catalog.||/');
ERROR: schema "ng_catalog" does not exist ERROR: schema "ng_catalog" does not exist
LINE 1: SELECT regoper('ng_catalog.||/'); LINE 1: SELECT regoper('ng_catalog.||/');
^ ^
SELECT regoperator('ng_catalog.+(int4,int4)');
ERROR: operator does not exist: ng_catalog.+(int4,int4)
LINE 1: SELECT regoperator('ng_catalog.+(int4,int4)');
^
SELECT regproc('ng_catalog.now'); SELECT regproc('ng_catalog.now');
ERROR: schema "ng_catalog" does not exist ERROR: schema "ng_catalog" does not exist
LINE 1: SELECT regproc('ng_catalog.now'); LINE 1: SELECT regproc('ng_catalog.now');
^ ^
SELECT regprocedure('ng_catalog.abs(numeric)');
ERROR: schema "ng_catalog" does not exist
LINE 1: SELECT regprocedure('ng_catalog.abs(numeric)');
^
SELECT regclass('ng_catalog.pg_class'); SELECT regclass('ng_catalog.pg_class');
ERROR: schema "ng_catalog" does not exist ERROR: schema "ng_catalog" does not exist
LINE 1: SELECT regclass('ng_catalog.pg_class'); LINE 1: SELECT regclass('ng_catalog.pg_class');
...@@ -143,12 +201,24 @@ SELECT to_regoper('||//'); ...@@ -143,12 +201,24 @@ SELECT to_regoper('||//');
(1 row) (1 row)
SELECT to_regoperator('++(int4,int4)');
to_regoperator
----------------
(1 row)
SELECT to_regproc('know'); SELECT to_regproc('know');
to_regproc to_regproc
------------ ------------
(1 row) (1 row)
SELECT to_regprocedure('absinthe(numeric)');
to_regprocedure
-----------------
(1 row)
SELECT to_regclass('pg_classes'); SELECT to_regclass('pg_classes');
to_regclass to_regclass
------------- -------------
...@@ -168,12 +238,24 @@ SELECT to_regoper('ng_catalog.||/'); ...@@ -168,12 +238,24 @@ SELECT to_regoper('ng_catalog.||/');
(1 row) (1 row)
SELECT to_regoperator('ng_catalog.+(int4,int4)');
to_regoperator
----------------
(1 row)
SELECT to_regproc('ng_catalog.now'); SELECT to_regproc('ng_catalog.now');
to_regproc to_regproc
------------ ------------
(1 row) (1 row)
SELECT to_regprocedure('ng_catalog.abs(numeric)');
to_regprocedure
-----------------
(1 row)
SELECT to_regclass('ng_catalog.pg_class'); SELECT to_regclass('ng_catalog.pg_class');
to_regclass to_regclass
------------- -------------
......
...@@ -7,24 +7,31 @@ ...@@ -7,24 +7,31 @@
-- without schemaname -- without schemaname
SELECT regoper('||/'); SELECT regoper('||/');
SELECT regoperator('+(int4,int4)');
SELECT regproc('now'); SELECT regproc('now');
SELECT regprocedure('abs(numeric)');
SELECT regclass('pg_class'); SELECT regclass('pg_class');
SELECT regtype('int4'); SELECT regtype('int4');
SELECT to_regoper('||/'); SELECT to_regoper('||/');
SELECT to_regoperator('+(int4,int4)');
SELECT to_regproc('now'); SELECT to_regproc('now');
SELECT to_regprocedure('abs(numeric)');
SELECT to_regclass('pg_class'); SELECT to_regclass('pg_class');
SELECT to_regtype('int4'); SELECT to_regtype('int4');
-- with schemaname -- with schemaname
SELECT regoper('pg_catalog.||/'); SELECT regoper('pg_catalog.||/');
SELECT regoperator('pg_catalog.+(int4,int4)');
SELECT regproc('pg_catalog.now'); SELECT regproc('pg_catalog.now');
SELECT regprocedure('pg_catalog.abs(numeric)');
SELECT regclass('pg_catalog.pg_class'); SELECT regclass('pg_catalog.pg_class');
SELECT regtype('pg_catalog.int4'); SELECT regtype('pg_catalog.int4');
SELECT to_regoper('pg_catalog.||/'); SELECT to_regoper('pg_catalog.||/');
SELECT to_regproc('pg_catalog.now'); SELECT to_regproc('pg_catalog.now');
SELECT to_regprocedure('pg_catalog.abs(numeric)');
SELECT to_regclass('pg_catalog.pg_class'); SELECT to_regclass('pg_catalog.pg_class');
SELECT to_regtype('pg_catalog.int4'); SELECT to_regtype('pg_catalog.int4');
...@@ -33,14 +40,18 @@ SELECT to_regtype('pg_catalog.int4'); ...@@ -33,14 +40,18 @@ SELECT to_regtype('pg_catalog.int4');
-- without schemaname -- without schemaname
SELECT regoper('||//'); SELECT regoper('||//');
SELECT regoperator('++(int4,int4)');
SELECT regproc('know'); SELECT regproc('know');
SELECT regprocedure('absinthe(numeric)');
SELECT regclass('pg_classes'); SELECT regclass('pg_classes');
SELECT regtype('int3'); SELECT regtype('int3');
-- with schemaname -- with schemaname
SELECT regoper('ng_catalog.||/'); SELECT regoper('ng_catalog.||/');
SELECT regoperator('ng_catalog.+(int4,int4)');
SELECT regproc('ng_catalog.now'); SELECT regproc('ng_catalog.now');
SELECT regprocedure('ng_catalog.abs(numeric)');
SELECT regclass('ng_catalog.pg_class'); SELECT regclass('ng_catalog.pg_class');
SELECT regtype('ng_catalog.int4'); SELECT regtype('ng_catalog.int4');
...@@ -49,13 +60,17 @@ SELECT regtype('ng_catalog.int4'); ...@@ -49,13 +60,17 @@ SELECT regtype('ng_catalog.int4');
-- without schemaname -- without schemaname
SELECT to_regoper('||//'); SELECT to_regoper('||//');
SELECT to_regoperator('++(int4,int4)');
SELECT to_regproc('know'); SELECT to_regproc('know');
SELECT to_regprocedure('absinthe(numeric)');
SELECT to_regclass('pg_classes'); SELECT to_regclass('pg_classes');
SELECT to_regtype('int3'); SELECT to_regtype('int3');
-- with schemaname -- with schemaname
SELECT to_regoper('ng_catalog.||/'); SELECT to_regoper('ng_catalog.||/');
SELECT to_regoperator('ng_catalog.+(int4,int4)');
SELECT to_regproc('ng_catalog.now'); SELECT to_regproc('ng_catalog.now');
SELECT to_regprocedure('ng_catalog.abs(numeric)');
SELECT to_regclass('ng_catalog.pg_class'); SELECT to_regclass('ng_catalog.pg_class');
SELECT to_regtype('ng_catalog.int4'); SELECT to_regtype('ng_catalog.int4');
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment