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

Commitb985d48

Browse files
committed
Further code review for range types patch.
Fix some bugs in coercion logic and pg_dump; more comment cleanup;minor cosmetic improvements.
1 parent40d3503 commitb985d48

File tree

13 files changed

+275
-265
lines changed

13 files changed

+275
-265
lines changed

‎doc/src/sgml/datatype.sgml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4506,15 +4506,21 @@ SELECT * FROM pg_attribute
45064506
<entry>Indicates that a function accepts any input data type.</entry>
45074507
</row>
45084508

4509+
<row>
4510+
<entry><type>anyelement</></entry>
4511+
<entry>Indicates that a function accepts any data type
4512+
(see <xref linkend="extend-types-polymorphic">).</entry>
4513+
</row>
4514+
45094515
<row>
45104516
<entry><type>anyarray</></entry>
45114517
<entry>Indicates that a function accepts any array data type
45124518
(see <xref linkend="extend-types-polymorphic">).</entry>
45134519
</row>
45144520

45154521
<row>
4516-
<entry><type>anyelement</></entry>
4517-
<entry>Indicates that a function accepts any data type
4522+
<entry><type>anynonarray</></entry>
4523+
<entry>Indicates that a function accepts anynon-arraydata type
45184524
(see <xref linkend="extend-types-polymorphic">).</entry>
45194525
</row>
45204526

@@ -4532,12 +4538,6 @@ SELECT * FROM pg_attribute
45324538
<xref linkend="rangetypes">).</entry>
45334539
</row>
45344540

4535-
<row>
4536-
<entry><type>anynonarray</></entry>
4537-
<entry>Indicates that a function accepts any non-array data type
4538-
(see <xref linkend="extend-types-polymorphic">).</entry>
4539-
</row>
4540-
45414541
<row>
45424542
<entry><type>cstring</></entry>
45434543
<entry>Indicates that a function accepts or returns a null-terminated C string.</entry>
@@ -4595,9 +4595,9 @@ SELECT * FROM pg_attribute
45954595
languages all forbid use of a pseudo-type as argument type, and allow
45964596
only <type>void</> and <type>record</> as a result type (plus
45974597
<type>trigger</> when the function is used as a trigger). Some also
4598-
support polymorphic functions using the types <type>anyarray</>,
4599-
<type>anyelement</>, <type>anyenum</>, <type>anyrange</>, and
4600-
<type>anynonarray</>.
4598+
support polymorphic functions using the types <type>anyelement</>,
4599+
<type>anyarray</>, <type>anynonarray</>, <type>anyenum</>, and
4600+
<type>anyrange</>.
46014601
</para>
46024602

46034603
<para>

‎src/backend/catalog/pg_proc.c

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ ProcedureCreate(const char *procedureName,
9191
intparameterCount;
9292
intallParamCount;
9393
Oid*allParams;
94-
char*modes=NULL;
94+
char*paramModes=NULL;
9595
boolgenericInParam= false;
9696
boolgenericOutParam= false;
9797
boolanyrangeInParam= false;
@@ -130,6 +130,7 @@ ProcedureCreate(const char *procedureName,
130130
FUNC_MAX_ARGS)));
131131
/* note: the above is correct, we do NOT count output arguments */
132132

133+
/* Deconstruct array inputs */
133134
if (allParameterTypes!=PointerGetDatum(NULL))
134135
{
135136
/*
@@ -169,28 +170,27 @@ ProcedureCreate(const char *procedureName,
169170
ARR_HASNULL(modesArray)||
170171
ARR_ELEMTYPE(modesArray)!=CHAROID)
171172
elog(ERROR,"parameterModes is not a 1-D char array");
172-
modes= (char*)ARR_DATA_PTR(modesArray);
173+
paramModes= (char*)ARR_DATA_PTR(modesArray);
173174
}
174175

175-
176176
/*
177-
* Do not allow polymorphic return type unless at least one input argument
178-
* is polymorphic.Also, do not allow return type INTERNAL unless at
179-
* least one input argument is INTERNAL.
177+
* Detect whether we have polymorphic or INTERNAL arguments. The first
178+
* loop checks input arguments, the second output arguments.
180179
*/
181180
for (i=0;i<parameterCount;i++)
182181
{
183182
switch (parameterTypes->values[i])
184183
{
185-
caseANYRANGEOID:
186-
anyrangeInParam= true;
187-
/* FALL THROUGH */
188184
caseANYARRAYOID:
189185
caseANYELEMENTOID:
190186
caseANYNONARRAYOID:
191187
caseANYENUMOID:
192188
genericInParam= true;
193189
break;
190+
caseANYRANGEOID:
191+
genericInParam= true;
192+
anyrangeInParam= true;
193+
break;
194194
caseINTERNALOID:
195195
internalInParam= true;
196196
break;
@@ -201,30 +201,37 @@ ProcedureCreate(const char *procedureName,
201201
{
202202
for (i=0;i<allParamCount;i++)
203203
{
204-
if (modes==NULL||
205-
(modes[i]!=PROARGMODE_OUT&&
206-
modes[i]!=PROARGMODE_INOUT&&
207-
modes[i]!=PROARGMODE_TABLE))
208-
continue;
204+
if (paramModes==NULL||
205+
paramModes[i]==PROARGMODE_IN||
206+
paramModes[i]==PROARGMODE_VARIADIC)
207+
continue;/* ignore input-only params */
209208

210209
switch (allParams[i])
211210
{
212-
caseANYRANGEOID:
213-
anyrangeOutParam= true;
214-
/* FALL THROUGH */
215211
caseANYARRAYOID:
216212
caseANYELEMENTOID:
217213
caseANYNONARRAYOID:
218214
caseANYENUMOID:
219215
genericOutParam= true;
220216
break;
217+
caseANYRANGEOID:
218+
genericOutParam= true;
219+
anyrangeOutParam= true;
220+
break;
221221
caseINTERNALOID:
222222
internalOutParam= true;
223223
break;
224224
}
225225
}
226226
}
227227

228+
/*
229+
* Do not allow polymorphic return type unless at least one input argument
230+
* is polymorphic. ANYRANGE return type is even stricter: must have an
231+
* ANYRANGE input (since we can't deduce the specific range type from
232+
* ANYELEMENT). Also, do not allow return type INTERNAL unless at least
233+
* one input argument is INTERNAL.
234+
*/
228235
if ((IsPolymorphicType(returnType)||genericOutParam)
229236
&& !genericInParam)
230237
ereport(ERROR,
@@ -259,7 +266,7 @@ ProcedureCreate(const char *procedureName,
259266
procedureName,
260267
format_type_be(parameterTypes->values[0]))));
261268

262-
if (modes!=NULL)
269+
if (paramModes!=NULL)
263270
{
264271
/*
265272
* Only the last input parameter can be variadic; if it is, save its
@@ -268,7 +275,7 @@ ProcedureCreate(const char *procedureName,
268275
*/
269276
for (i=0;i<allParamCount;i++)
270277
{
271-
switch (modes[i])
278+
switch (paramModes[i])
272279
{
273280
casePROARGMODE_IN:
274281
casePROARGMODE_INOUT:
@@ -298,7 +305,7 @@ ProcedureCreate(const char *procedureName,
298305
}
299306
break;
300307
default:
301-
elog(ERROR,"invalid parameter mode '%c'",modes[i]);
308+
elog(ERROR,"invalid parameter mode '%c'",paramModes[i]);
302309
break;
303310
}
304311
}

‎src/backend/commands/typecmds.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -654,9 +654,9 @@ RemoveTypeById(Oid typeOid)
654654
EnumValuesDelete(typeOid);
655655

656656
/*
657-
* If it is a range type, delete the pg_rangeentries too; we don't bother
658-
* with making dependencyentries forthose, so it has to be done "by
659-
*hand"here.
657+
* If it is a range type, delete the pg_rangeentry too; we don't bother
658+
* with makingadependencyentry forthat, so it has to be done "by hand"
659+
* here.
660660
*/
661661
if (((Form_pg_type)GETSTRUCT(tup))->typtype==TYPTYPE_RANGE)
662662
RangeDelete(typeOid);
@@ -1475,8 +1475,9 @@ makeRangeConstructor(char *name, Oid namespace, Oid rangeOid, Oid subtype)
14751475
0.0);/* prorows */
14761476

14771477
/*
1478-
* Make the constructor internally-dependent on the range type so that
1479-
* the user doesn't have to treat them as separate objects.
1478+
* Make the constructors internally-dependent on the range type so
1479+
* that they go away silently when the type is dropped. Note that
1480+
* pg_dump depends on this choice to avoid dumping the constructors.
14801481
*/
14811482
myself.classId=ProcedureRelationId;
14821483
myself.objectId=procOid;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp