aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/proclang.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-09-21 18:39:26 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-09-21 18:39:26 +0000
commiteb3adab5685ce5a60bcf96628244f1e2a8e0ab3b (patch)
tree55ba25cb13ec6a414c7faf86a6d8da8357cfbfe7 /src/backend/commands/proclang.c
parentbc499687641a021e0dac3e146611b5a553cf0c5b (diff)
downloadpostgresql-eb3adab5685ce5a60bcf96628244f1e2a8e0ab3b.tar.gz
postgresql-eb3adab5685ce5a60bcf96628244f1e2a8e0ab3b.zip
Provide an upgrade strategy for dump files containing functions declared
with OPAQUE. CREATE LANGUAGE, CREATE TRIGGER, and CREATE TYPE will all accept references to functions declared with OPAQUE --- but they will issue a NOTICE, and will modify the function entries in pg_proc to have the preferred type-safe argument or result types instead of OPAQUE. Per recent pghackers discussions.
Diffstat (limited to 'src/backend/commands/proclang.c')
-rw-r--r--src/backend/commands/proclang.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 0d282e8f85c..03d022f1f4f 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.42 2002/09/04 20:31:15 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/proclang.c,v 1.43 2002/09/21 18:39:25 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -43,6 +43,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
char languageName[NAMEDATALEN];
Oid procOid,
valProcOid;
+ Oid funcrettype;
Oid typev[FUNC_MAX_ARGS];
char nulls[Natts_pg_language];
Datum values[Natts_pg_language];
@@ -80,10 +81,24 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
if (!OidIsValid(procOid))
elog(ERROR, "function %s() doesn't exist",
NameListToString(stmt->plhandler));
- if (get_func_rettype(procOid) != LANGUAGE_HANDLEROID)
- elog(ERROR, "function %s() does not return type %s",
- NameListToString(stmt->plhandler),
- format_type_be(LANGUAGE_HANDLEROID));
+ funcrettype = get_func_rettype(procOid);
+ if (funcrettype != LANGUAGE_HANDLEROID)
+ {
+ /*
+ * We allow OPAQUE just so we can load old dump files. When we
+ * see a handler function declared OPAQUE, change it to
+ * LANGUAGE_HANDLER.
+ */
+ if (funcrettype == OPAQUEOID)
+ {
+ elog(NOTICE, "CreateProceduralLanguage: changing return type of function %s() from OPAQUE to LANGUAGE_HANDLER",
+ NameListToString(stmt->plhandler));
+ SetFunctionReturnType(procOid, LANGUAGE_HANDLEROID);
+ }
+ else
+ elog(ERROR, "CreateProceduralLanguage: function %s() must return LANGUAGE_HANDLER",
+ NameListToString(stmt->plhandler));
+ }
/* validate the validator function */
if (stmt->plvalidator)