Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdfc0219

Browse files
committed
Add to_regprocedure() and to_regoperator().
These are natural complements to the functions added by commit0886fc6, but they weren't includedin the original patch for some reason. Add them.Patch by me, per a complaint by Tom Lane. Review by TatsuoIshii.
1 parent1a81daa commitdfc0219

File tree

7 files changed

+199
-5
lines changed

7 files changed

+199
-5
lines changed

‎doc/src/sgml/func.sgml

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15293,10 +15293,18 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
1529315293
<primary>to_regproc</primary>
1529415294
</indexterm>
1529515295

15296+
<indexterm>
15297+
<primary>to_regprocedure</primary>
15298+
</indexterm>
15299+
1529615300
<indexterm>
1529715301
<primary>to_regoper</primary>
1529815302
</indexterm>
1529915303

15304+
<indexterm>
15305+
<primary>to_regoperator</primary>
15306+
</indexterm>
15307+
1530015308
<indexterm>
1530115309
<primary>to_regtype</primary>
1530215310
</indexterm>
@@ -15481,11 +15489,21 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
1548115489
<entry><type>regproc</type></entry>
1548215490
<entry>get the oid of the named function</entry>
1548315491
</row>
15492+
<row>
15493+
<entry><literal><function>to_regprocedure(<parameter>func_name</parameter>)</function></literal></entry>
15494+
<entry><type>regprocedure</type></entry>
15495+
<entry>get the oid of the named function</entry>
15496+
</row>
1548415497
<row>
1548515498
<entry><literal><function>to_regoper(<parameter>operator_name</parameter>)</function></literal></entry>
1548615499
<entry><type>regoper</type></entry>
1548715500
<entry>get the oid of the named operator</entry>
1548815501
</row>
15502+
<row>
15503+
<entry><literal><function>to_regoperator(<parameter>operator_name</parameter>)</function></literal></entry>
15504+
<entry><type>regoperator</type></entry>
15505+
<entry>get the oid of the named operator</entry>
15506+
</row>
1548915507
<row>
1549015508
<entry><literal><function>to_regtype(<parameter>type_name</parameter>)</function></literal></entry>
1549115509
<entry><type>regtype</type></entry>
@@ -15658,10 +15676,12 @@ SELECT collation for ('foo' COLLATE "de_DE");
1565815676

1565915677
<para>
1566015678
The <function>to_regclass</function>, <function>to_regproc</function>,
15661-
<function>to_regoper</function> and <function>to_regtype</function>
15662-
translate relation, function, operator, and type names to objects of
15663-
type <type>regclass</>, <type>regproc</>, <type>regoper</> and
15664-
<type>regtype</>, respectively. These functions differ from a cast from
15679+
<function>to_regprocedure</function>, <function>to_regoper</function>,
15680+
<function>to_regoperator</function>, and <function>to_regtype</function>
15681+
functions translate relation, function, operator, and type names to objects
15682+
of type <type>regclass</>, <type>regproc</>, <type>regprocedure</type>,
15683+
<type>regoper</>, <type>regoperator</type>, and <type>regtype</>,
15684+
respectively. These functions differ from a cast from
1566515685
text in that they don't accept a numeric OID, and that they return null
1566615686
rather than throwing an error if the name is not found (or, for
1566715687
<function>to_regproc</function> and <function>to_regoper</function>, if

‎src/backend/utils/adt/regproc.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,38 @@ regprocedurein(PG_FUNCTION_ARGS)
322322
PG_RETURN_OID(result);
323323
}
324324

325+
/*
326+
* to_regprocedure- converts "proname(args)" to proc OID
327+
*
328+
* If the name is not found, we return NULL.
329+
*/
330+
Datum
331+
to_regprocedure(PG_FUNCTION_ARGS)
332+
{
333+
char*pro_name=PG_GETARG_CSTRING(0);
334+
List*names;
335+
intnargs;
336+
Oidargtypes[FUNC_MAX_ARGS];
337+
FuncCandidateListclist;
338+
339+
/*
340+
* Parse the name and arguments, look up potential matches in the current
341+
* namespace search list, and scan to see which one exactly matches the
342+
* given argument types.(There will not be more than one match.)
343+
*/
344+
parseNameAndArgTypes(pro_name, false,&names,&nargs,argtypes);
345+
346+
clist=FuncnameGetCandidates(names,nargs,NIL, false, false, true);
347+
348+
for (;clist;clist=clist->next)
349+
{
350+
if (memcmp(clist->args,argtypes,nargs*sizeof(Oid))==0)
351+
PG_RETURN_OID(clist->oid);
352+
}
353+
354+
PG_RETURN_NULL();
355+
}
356+
325357
/*
326358
* format_procedure- converts proc OID to "pro_name(args)"
327359
*
@@ -721,6 +753,45 @@ regoperatorin(PG_FUNCTION_ARGS)
721753
PG_RETURN_OID(result);
722754
}
723755

756+
/*
757+
* to_regoperator- converts "oprname(args)" to operator OID
758+
*
759+
* If the name is not found, we return NULL.
760+
*/
761+
Datum
762+
to_regoperator(PG_FUNCTION_ARGS)
763+
{
764+
char*opr_name_or_oid=PG_GETARG_CSTRING(0);
765+
Oidresult;
766+
List*names;
767+
intnargs;
768+
Oidargtypes[FUNC_MAX_ARGS];
769+
770+
/*
771+
* Parse the name and arguments, look up potential matches in the current
772+
* namespace search list, and scan to see which one exactly matches the
773+
* given argument types.(There will not be more than one match.)
774+
*/
775+
parseNameAndArgTypes(opr_name_or_oid, true,&names,&nargs,argtypes);
776+
if (nargs==1)
777+
ereport(ERROR,
778+
(errcode(ERRCODE_UNDEFINED_PARAMETER),
779+
errmsg("missing argument"),
780+
errhint("Use NONE to denote the missing argument of a unary operator.")));
781+
if (nargs!=2)
782+
ereport(ERROR,
783+
(errcode(ERRCODE_TOO_MANY_ARGUMENTS),
784+
errmsg("too many arguments"),
785+
errhint("Provide two argument types for operator.")));
786+
787+
result=OpernameGetOprid(names,argtypes[0],argtypes[1]);
788+
789+
if (!OidIsValid(result))
790+
PG_RETURN_NULL();
791+
792+
PG_RETURN_OID(result);
793+
}
794+
724795
/*
725796
* format_operator- converts operator OID to "opr_name(args)"
726797
*

‎src/include/catalog/catversion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/*yyyymmddN */
56-
#defineCATALOG_VERSION_NO201404123
56+
#defineCATALOG_VERSION_NO201404161
5757

5858
#endif

‎src/include/catalog/pg_proc.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
175175
DESCR("I/O");
176176
DATA(insertOID=3494 (to_regprocPGNSPPGUID121000fffftfs1024"2275"_null__null__null__null_to_regproc_null__null__null_ ));
177177
DESCR("convert proname to regproc");
178+
DATA(insertOID=3479 (to_regprocedurePGNSPPGUID121000fffftfs102202"2275"_null__null__null__null_to_regprocedure_null__null__null_ ));
179+
DESCR("convert proname to regprocedure");
178180
DATA(insertOID=46 (textinPGNSPPGUID121000fffftfi1025"2275"_null__null__null__null_textin_null__null__null_ ));
179181
DESCR("I/O");
180182
DATA(insertOID=47 (textoutPGNSPPGUID121000fffftfi102275"25"_null__null__null__null_textout_null__null__null_ ));
@@ -3351,6 +3353,8 @@ DATA(insert OID = 2215 ( regoperoutPGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2
33513353
DESCR("I/O");
33523354
DATA(insertOID=3492 (to_regoperPGNSPPGUID121000fffftfs102203"2275"_null__null__null__null_to_regoper_null__null__null_ ));
33533355
DESCR("convert operator name to regoper");
3356+
DATA(insertOID=3476 (to_regoperatorPGNSPPGUID121000fffftfs102204"2275"_null__null__null__null_to_regoperator_null__null__null_ ));
3357+
DESCR("convert operator name to regoperator");
33543358
DATA(insertOID=2216 (regoperatorinPGNSPPGUID121000fffftfs102204"2275"_null__null__null__null_regoperatorin_null__null__null_ ));
33553359
DESCR("I/O");
33563360
DATA(insertOID=2217 (regoperatoroutPGNSPPGUID121000fffftfs102275"2204"_null__null__null__null_regoperatorout_null__null__null_ ));

‎src/include/utils/builtins.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,7 @@ extern char *regexp_fixed_prefix(text *text_re, bool case_insensitive,
602602
externDatumregprocin(PG_FUNCTION_ARGS);
603603
externDatumregprocout(PG_FUNCTION_ARGS);
604604
externDatumto_regproc(PG_FUNCTION_ARGS);
605+
externDatumto_regprocedure(PG_FUNCTION_ARGS);
605606
externDatumregprocrecv(PG_FUNCTION_ARGS);
606607
externDatumregprocsend(PG_FUNCTION_ARGS);
607608
externDatumregprocedurein(PG_FUNCTION_ARGS);
@@ -613,6 +614,7 @@ extern Datum regoperout(PG_FUNCTION_ARGS);
613614
externDatumregoperrecv(PG_FUNCTION_ARGS);
614615
externDatumregopersend(PG_FUNCTION_ARGS);
615616
externDatumto_regoper(PG_FUNCTION_ARGS);
617+
externDatumto_regoperator(PG_FUNCTION_ARGS);
616618
externDatumregoperatorin(PG_FUNCTION_ARGS);
617619
externDatumregoperatorout(PG_FUNCTION_ARGS);
618620
externDatumregoperatorrecv(PG_FUNCTION_ARGS);

‎src/test/regress/expected/regproc.out

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,24 @@ SELECT regoper('||/');
99
||/
1010
(1 row)
1111

12+
SELECT regoperator('+(int4,int4)');
13+
regoperator
14+
--------------------
15+
+(integer,integer)
16+
(1 row)
17+
1218
SELECT regproc('now');
1319
regproc
1420
---------
1521
now
1622
(1 row)
1723

24+
SELECT regprocedure('abs(numeric)');
25+
regprocedure
26+
--------------
27+
abs(numeric)
28+
(1 row)
29+
1830
SELECT regclass('pg_class');
1931
regclass
2032
----------
@@ -33,12 +45,24 @@ SELECT to_regoper('||/');
3345
||/
3446
(1 row)
3547

48+
SELECT to_regoperator('+(int4,int4)');
49+
to_regoperator
50+
--------------------
51+
+(integer,integer)
52+
(1 row)
53+
3654
SELECT to_regproc('now');
3755
to_regproc
3856
------------
3957
now
4058
(1 row)
4159

60+
SELECT to_regprocedure('abs(numeric)');
61+
to_regprocedure
62+
-----------------
63+
abs(numeric)
64+
(1 row)
65+
4266
SELECT to_regclass('pg_class');
4367
to_regclass
4468
-------------
@@ -58,12 +82,24 @@ SELECT regoper('pg_catalog.||/');
5882
||/
5983
(1 row)
6084

85+
SELECT regoperator('pg_catalog.+(int4,int4)');
86+
regoperator
87+
--------------------
88+
+(integer,integer)
89+
(1 row)
90+
6191
SELECT regproc('pg_catalog.now');
6292
regproc
6393
---------
6494
now
6595
(1 row)
6696

97+
SELECT regprocedure('pg_catalog.abs(numeric)');
98+
regprocedure
99+
--------------
100+
abs(numeric)
101+
(1 row)
102+
67103
SELECT regclass('pg_catalog.pg_class');
68104
regclass
69105
----------
@@ -88,6 +124,12 @@ SELECT to_regproc('pg_catalog.now');
88124
now
89125
(1 row)
90126

127+
SELECT to_regprocedure('pg_catalog.abs(numeric)');
128+
to_regprocedure
129+
-----------------
130+
abs(numeric)
131+
(1 row)
132+
91133
SELECT to_regclass('pg_catalog.pg_class');
92134
to_regclass
93135
-------------
@@ -106,10 +148,18 @@ SELECT regoper('||//');
106148
ERROR: operator does not exist: ||//
107149
LINE 3: SELECT regoper('||//');
108150
^
151+
SELECT regoperator('++(int4,int4)');
152+
ERROR: operator does not exist: ++(int4,int4)
153+
LINE 1: SELECT regoperator('++(int4,int4)');
154+
^
109155
SELECT regproc('know');
110156
ERROR: function "know" does not exist
111157
LINE 1: SELECT regproc('know');
112158
^
159+
SELECT regprocedure('absinthe(numeric)');
160+
ERROR: function "absinthe(numeric)" does not exist
161+
LINE 1: SELECT regprocedure('absinthe(numeric)');
162+
^
113163
SELECT regclass('pg_classes');
114164
ERROR: relation "pg_classes" does not exist
115165
LINE 1: SELECT regclass('pg_classes');
@@ -123,10 +173,18 @@ SELECT regoper('ng_catalog.||/');
123173
ERROR: schema "ng_catalog" does not exist
124174
LINE 1: SELECT regoper('ng_catalog.||/');
125175
^
176+
SELECT regoperator('ng_catalog.+(int4,int4)');
177+
ERROR: operator does not exist: ng_catalog.+(int4,int4)
178+
LINE 1: SELECT regoperator('ng_catalog.+(int4,int4)');
179+
^
126180
SELECT regproc('ng_catalog.now');
127181
ERROR: schema "ng_catalog" does not exist
128182
LINE 1: SELECT regproc('ng_catalog.now');
129183
^
184+
SELECT regprocedure('ng_catalog.abs(numeric)');
185+
ERROR: schema "ng_catalog" does not exist
186+
LINE 1: SELECT regprocedure('ng_catalog.abs(numeric)');
187+
^
130188
SELECT regclass('ng_catalog.pg_class');
131189
ERROR: schema "ng_catalog" does not exist
132190
LINE 1: SELECT regclass('ng_catalog.pg_class');
@@ -143,12 +201,24 @@ SELECT to_regoper('||//');
143201

144202
(1 row)
145203

204+
SELECT to_regoperator('++(int4,int4)');
205+
to_regoperator
206+
----------------
207+
208+
(1 row)
209+
146210
SELECT to_regproc('know');
147211
to_regproc
148212
------------
149213

150214
(1 row)
151215

216+
SELECT to_regprocedure('absinthe(numeric)');
217+
to_regprocedure
218+
-----------------
219+
220+
(1 row)
221+
152222
SELECT to_regclass('pg_classes');
153223
to_regclass
154224
-------------
@@ -168,12 +238,24 @@ SELECT to_regoper('ng_catalog.||/');
168238

169239
(1 row)
170240

241+
SELECT to_regoperator('ng_catalog.+(int4,int4)');
242+
to_regoperator
243+
----------------
244+
245+
(1 row)
246+
171247
SELECT to_regproc('ng_catalog.now');
172248
to_regproc
173249
------------
174250

175251
(1 row)
176252

253+
SELECT to_regprocedure('ng_catalog.abs(numeric)');
254+
to_regprocedure
255+
-----------------
256+
257+
(1 row)
258+
177259
SELECT to_regclass('ng_catalog.pg_class');
178260
to_regclass
179261
-------------

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp