From d60f10b0e74173653d17c09750a791afe6f56404 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 22 May 2002 17:21:02 +0000 Subject: Add optional "validator" function to languages that can validate the function body (and other properties) as a function in the language is created. This generalizes ad hoc code that already existed for the built-in languages. The validation now happens after the pg_proc tuple of the new function is created, so it is possible to define recursive SQL functions. Add some regression test cases that cover bogus function definition attempts. --- src/backend/commands/functioncmds.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'src/backend/commands/functioncmds.c') diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 06870b0d3d2..a619a71b435 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.5 2002/05/18 13:47:59 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.6 2002/05/22 17:20:58 petere Exp $ * * DESCRIPTION * These routines take the parse tree and pick out the @@ -388,6 +388,7 @@ CreateFunction(CreateFunctionStmt *stmt) char *language; char languageName[NAMEDATALEN]; Oid languageOid; + Oid languageValidator; char *funcname; Oid namespaceId; AclResult aclresult; @@ -457,6 +458,8 @@ CreateFunction(CreateFunctionStmt *stmt) aclcheck_error(ACLCHECK_NO_PRIV, NameStr(languageStruct->lanname)); } + languageValidator = languageStruct->lanvalidator; + ReleaseSysCache(languageTuple); /* @@ -477,6 +480,28 @@ CreateFunction(CreateFunctionStmt *stmt) interpret_AS_clause(languageOid, languageName, as_clause, &prosrc_str, &probin_str); + if (languageOid == INTERNALlanguageId) + { + /* + * In PostgreSQL versions before 6.5, the SQL name of the + * created function could not be different from the internal + * name, and "prosrc" wasn't used. So there is code out there + * that does CREATE FUNCTION xyz AS '' LANGUAGE 'internal'. + * To preserve some modicum of backwards compatibility, accept + * an empty "prosrc" value as meaning the supplied SQL + * function name. + */ + if (strlen(prosrc_str) == 0) + prosrc_str = funcname; + } + + if (languageOid == ClanguageId) + { + /* If link symbol is specified as "-", substitute procedure name */ + if (strcmp(prosrc_str, "-") == 0) + prosrc_str = funcname; + } + /* * And now that we have all the parameters, and know we're permitted * to do so, go ahead and create the function. @@ -487,6 +512,7 @@ CreateFunction(CreateFunctionStmt *stmt) returnsSet, prorettype, languageOid, + languageValidator, prosrc_str, /* converted to text later */ probin_str, /* converted to text later */ false, /* not an aggregate */ -- cgit v1.2.3