Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a77e32d

Browse files
committed
Apply the core parts of Dennis Bjorklund's patch to allow function
parameters to be declared with names. pg_proc has a column to store names, and CREATE FUNCTION can insert data into it, but that's all as yet. I need to do more work on the pg_dump and plpgsql portions of the patch before committing those, but I thought I'd get the bulky changes in before the tree drifts under me. initdb forced due to pg_proc change.
1 parent 488f278 commit a77e32d

File tree

20 files changed

+1848
-1657
lines changed

20 files changed

+1848
-1657
lines changed

doc/src/sgml/catalogs.sgml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<!--
22
Documentation of the system catalogs, directed toward PostgreSQL developers
3-
$PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.81 2003/12/06 23:10:21 joe Exp $
3+
$PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.82 2004/01/06 23:55:18 tgl Exp $
44
-->
55

66
<chapter id="catalogs">
@@ -2798,6 +2798,17 @@
27982798
<entry>An array with the data types of the function arguments</entry>
27992799
</row>
28002800

2801+
<row>
2802+
<entry><structfield>proargnames</structfield></entry>
2803+
<entry><type>text[]</type></entry>
2804+
<entry></entry>
2805+
<entry>
2806+
An array with the names of the function arguments.
2807+
Arguments without a name are set to empty strings in the array.
2808+
If none of the arguments have a name, this field may be null.
2809+
</entry>
2810+
</row>
2811+
28012812
<row>
28022813
<entry><structfield>prosrc</structfield></entry>
28032814
<entry><type>text</type></entry>

src/backend/bootstrap/bootstrap.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.173 2004/01/06 23:15:22 momjian Exp $
11+
* $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.174 2004/01/06 23:55:18 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -130,6 +130,7 @@ static struct typinfo Procid[] = {
130130
{"oidvector", OIDVECTOROID, 0, INDEX_MAX_KEYS * 4, F_OIDVECTORIN, F_OIDVECTOROUT},
131131
{"smgr", 210, 0, 2, F_SMGRIN, F_SMGROUT},
132132
{"_int4", 1007, INT4OID, -1, F_ARRAY_IN, F_ARRAY_OUT},
133+
{"_text", 1009, TEXTOID, -1, F_ARRAY_IN, F_ARRAY_OUT},
133134
{"_aclitem", 1034, 1033, -1, F_ARRAY_IN, F_ARRAY_OUT}
134135
};
135136

@@ -690,6 +691,11 @@ DefineAttr(char *name, char *type, int attnum)
690691
attrtypes[attnum]->attbyval = Ap->am_typ.typbyval;
691692
attrtypes[attnum]->attstorage = Ap->am_typ.typstorage;
692693
attrtypes[attnum]->attalign = Ap->am_typ.typalign;
694+
/* if an array type, assume 1-dimensional attribute */
695+
if (Ap->am_typ.typelem != InvalidOid && Ap->am_typ.typlen < 0)
696+
attrtypes[attnum]->attndims = 1;
697+
else
698+
attrtypes[attnum]->attndims = 0;
693699
}
694700
else
695701
{
@@ -729,7 +735,14 @@ DefineAttr(char *name, char *type, int attnum)
729735
attrtypes[attnum]->attalign = 'i';
730736
break;
731737
}
738+
/* if an array type, assume 1-dimensional attribute */
739+
if (Procid[typeoid].elem != InvalidOid && attlen < 0)
740+
attrtypes[attnum]->attndims = 1;
741+
else
742+
attrtypes[attnum]->attndims = 0;
732743
}
744+
745+
attrtypes[attnum]->attstattarget = -1;
733746
attrtypes[attnum]->attcacheoff = -1;
734747
attrtypes[attnum]->atttypmod = -1;
735748
attrtypes[attnum]->attislocal = true;

src/backend/catalog/pg_aggregate.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.65 2003/11/29 19:51:45 pgsql Exp $
11+
* $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.66 2004/01/06 23:55:18 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -190,7 +190,8 @@ AggregateCreate(const char *aggName,
190190
PROVOLATILE_IMMUTABLE, /* volatility (not
191191
* needed for agg) */
192192
1, /* parameterCount */
193-
fnArgs); /* parameterTypes */
193+
fnArgs, /* parameterTypes */
194+
NULL); /* parameterNames */
194195

195196
/*
196197
* Okay to create the pg_aggregate entry.

src/backend/catalog/pg_proc.c

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.110 2003/11/29 19:51:46 pgsql Exp $
11+
* $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.111 2004/01/06 23:55:18 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -42,6 +42,9 @@ Datum fmgr_internal_validator(PG_FUNCTION_ARGS);
4242
Datum fmgr_c_validator(PG_FUNCTION_ARGS);
4343
Datum fmgr_sql_validator(PG_FUNCTION_ARGS);
4444

45+
static Datum create_parameternames_array(int parameterCount,
46+
const char *parameterNames[]);
47+
4548

4649
/* ----------------------------------------------------------------
4750
* ProcedureCreate
@@ -62,7 +65,8 @@ ProcedureCreate(const char *procedureName,
6265
bool isStrict,
6366
char volatility,
6467
int parameterCount,
65-
const Oid *parameterTypes)
68+
const Oid *parameterTypes,
69+
const char *parameterNames[])
6670
{
6771
int i;
6872
Relation rel;
@@ -72,6 +76,7 @@ ProcedureCreate(const char *procedureName,
7276
Datum values[Natts_pg_proc];
7377
char replaces[Natts_pg_proc];
7478
Oid typev[FUNC_MAX_ARGS];
79+
Datum namesarray;
7580
Oid relid;
7681
NameData procname;
7782
TupleDesc tupDesc;
@@ -122,6 +127,9 @@ ProcedureCreate(const char *procedureName,
122127
if (parameterCount > 0)
123128
memcpy(typev, parameterTypes, parameterCount * sizeof(Oid));
124129

130+
/* Process param names, if given */
131+
namesarray = create_parameternames_array(parameterCount, parameterNames);
132+
125133
if (languageObjectId == SQLlanguageId)
126134
{
127135
/*
@@ -197,6 +205,9 @@ ProcedureCreate(const char *procedureName,
197205
values[i++] = UInt16GetDatum(parameterCount); /* pronargs */
198206
values[i++] = ObjectIdGetDatum(returnType); /* prorettype */
199207
values[i++] = PointerGetDatum(typev); /* proargtypes */
208+
values[i++] = namesarray; /* proargnames */
209+
if (namesarray == PointerGetDatum(NULL))
210+
nulls[Anum_pg_proc_proargnames - 1] = 'n';
200211
values[i++] = DirectFunctionCall1(textin, /* prosrc */
201212
CStringGetDatum(prosrc));
202213
values[i++] = DirectFunctionCall1(textin, /* probin */
@@ -334,6 +345,43 @@ ProcedureCreate(const char *procedureName,
334345
return retval;
335346
}
336347

348+
349+
/*
350+
* create_parameternames_array - build proargnames value from an array
351+
* of C strings. Returns a NULL pointer if no names provided.
352+
*/
353+
static Datum
354+
create_parameternames_array(int parameterCount, const char *parameterNames[])
355+
{
356+
Datum elems[FUNC_MAX_ARGS];
357+
bool found = false;
358+
ArrayType *names;
359+
int i;
360+
361+
if (!parameterNames)
362+
return PointerGetDatum(NULL);
363+
364+
for (i=0; i<parameterCount; i++)
365+
{
366+
const char *s = parameterNames[i];
367+
368+
if (s && *s)
369+
found = true;
370+
else
371+
s = "";
372+
373+
elems[i] = DirectFunctionCall1(textin, CStringGetDatum(s));
374+
}
375+
376+
if (!found)
377+
return PointerGetDatum(NULL);
378+
379+
names = construct_array(elems, parameterCount, TEXTOID, -1, false, 'i');
380+
381+
return PointerGetDatum(names);
382+
}
383+
384+
337385
/*
338386
* check_sql_fn_retval() -- check return value of a list of sql parse trees.
339387
*

src/backend/commands/functioncmds.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.42 2003/11/29 19:51:47 pgsql Exp $
13+
* $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.43 2004/01/06 23:55:18 tgl Exp $
1414
*
1515
* DESCRIPTION
1616
* These routines take the parse tree and pick out the
@@ -130,19 +130,22 @@ compute_return_type(TypeName *returnType, Oid languageOid,
130130
}
131131

132132
/*
133-
* Interpret the argument-types list of the CREATE FUNCTION statement.
133+
* Interpret the parameter list of the CREATE FUNCTION statement.
134134
*/
135135
static int
136-
compute_parameter_types(List *argTypes, Oid languageOid,
137-
Oid *parameterTypes)
136+
examine_parameter_list(List *parameter, Oid languageOid,
137+
Oid *parameterTypes, const char *parameterNames[])
138138
{
139139
int parameterCount = 0;
140140
List *x;
141141

142142
MemSet(parameterTypes, 0, FUNC_MAX_ARGS * sizeof(Oid));
143-
foreach(x, argTypes)
143+
MemSet(parameterNames, 0, FUNC_MAX_ARGS * sizeof(char *));
144+
145+
foreach(x, parameter)
144146
{
145-
TypeName *t = (TypeName *) lfirst(x);
147+
FunctionParameter *fp = (FunctionParameter *) lfirst(x);
148+
TypeName *t = fp->argType;
146149
Oid toid;
147150

148151
if (parameterCount >= FUNC_MAX_ARGS)
@@ -182,7 +185,11 @@ compute_parameter_types(List *argTypes, Oid languageOid,
182185
(errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
183186
errmsg("functions cannot accept set arguments")));
184187

185-
parameterTypes[parameterCount++] = toid;
188+
parameterTypes[parameterCount] = toid;
189+
190+
parameterNames[parameterCount] = fp->name;
191+
192+
parameterCount++;
186193
}
187194

188195
return parameterCount;
@@ -402,6 +409,7 @@ CreateFunction(CreateFunctionStmt *stmt)
402409
AclResult aclresult;
403410
int parameterCount;
404411
Oid parameterTypes[FUNC_MAX_ARGS];
412+
const char *parameterNames[FUNC_MAX_ARGS];
405413
bool isStrict,
406414
security;
407415
char volatility;
@@ -480,8 +488,8 @@ CreateFunction(CreateFunctionStmt *stmt)
480488
compute_return_type(stmt->returnType, languageOid,
481489
&prorettype, &returnsSet);
482490

483-
parameterCount = compute_parameter_types(stmt->argTypes, languageOid,
484-
parameterTypes);
491+
parameterCount = examine_parameter_list(stmt->parameters, languageOid,
492+
parameterTypes, parameterNames);
485493

486494
compute_attributes_with_style(stmt->withClause, &isStrict, &volatility);
487495

@@ -527,7 +535,8 @@ CreateFunction(CreateFunctionStmt *stmt)
527535
isStrict,
528536
volatility,
529537
parameterCount,
530-
parameterTypes);
538+
parameterTypes,
539+
parameterNames);
531540
}
532541

533542

src/backend/nodes/copyfuncs.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Portions Copyright (c) 1994, Regents of the University of California
1616
*
1717
* IDENTIFICATION
18-
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.274 2004/01/06 04:31:01 tgl Exp $
18+
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.275 2004/01/06 23:55:18 tgl Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -1878,14 +1878,25 @@ _copyCreateFunctionStmt(CreateFunctionStmt *from)
18781878

18791879
COPY_SCALAR_FIELD(replace);
18801880
COPY_NODE_FIELD(funcname);
1881-
COPY_NODE_FIELD(argTypes);
1881+
COPY_NODE_FIELD(parameters);
18821882
COPY_NODE_FIELD(returnType);
18831883
COPY_NODE_FIELD(options);
18841884
COPY_NODE_FIELD(withClause);
18851885

18861886
return newnode;
18871887
}
18881888

1889+
static FunctionParameter *
1890+
_copyFunctionParameter(FunctionParameter *from)
1891+
{
1892+
FunctionParameter *newnode = makeNode(FunctionParameter);
1893+
1894+
COPY_STRING_FIELD(name);
1895+
COPY_NODE_FIELD(argType);
1896+
1897+
return newnode;
1898+
}
1899+
18891900
static RemoveAggrStmt *
18901901
_copyRemoveAggrStmt(RemoveAggrStmt *from)
18911902
{
@@ -2788,6 +2799,9 @@ copyObject(void *from)
27882799
case T_CreateFunctionStmt:
27892800
retval = _copyCreateFunctionStmt(from);
27902801
break;
2802+
case T_FunctionParameter:
2803+
retval = _copyFunctionParameter(from);
2804+
break;
27912805
case T_RemoveAggrStmt:
27922806
retval = _copyRemoveAggrStmt(from);
27932807
break;

src/backend/nodes/equalfuncs.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* Portions Copyright (c) 1994, Regents of the University of California
1919
*
2020
* IDENTIFICATION
21-
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.212 2004/01/05 05:07:35 tgl Exp $
21+
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.213 2004/01/06 23:55:18 tgl Exp $
2222
*
2323
*-------------------------------------------------------------------------
2424
*/
@@ -884,14 +884,23 @@ _equalCreateFunctionStmt(CreateFunctionStmt *a, CreateFunctionStmt *b)
884884
{
885885
COMPARE_SCALAR_FIELD(replace);
886886
COMPARE_NODE_FIELD(funcname);
887-
COMPARE_NODE_FIELD(argTypes);
887+
COMPARE_NODE_FIELD(parameters);
888888
COMPARE_NODE_FIELD(returnType);
889889
COMPARE_NODE_FIELD(options);
890890
COMPARE_NODE_FIELD(withClause);
891891

892892
return true;
893893
}
894894

895+
static bool
896+
_equalFunctionParameter(FunctionParameter *a, FunctionParameter *b)
897+
{
898+
COMPARE_STRING_FIELD(name);
899+
COMPARE_NODE_FIELD(argType);
900+
901+
return true;
902+
}
903+
895904
static bool
896905
_equalRemoveAggrStmt(RemoveAggrStmt *a, RemoveAggrStmt *b)
897906
{
@@ -1868,6 +1877,9 @@ equal(void *a, void *b)
18681877
case T_CreateFunctionStmt:
18691878
retval = _equalCreateFunctionStmt(a, b);
18701879
break;
1880+
case T_FunctionParameter:
1881+
retval = _equalFunctionParameter(a, b);
1882+
break;
18711883
case T_RemoveAggrStmt:
18721884
retval = _equalRemoveAggrStmt(a, b);
18731885
break;

0 commit comments

Comments
 (0)