From 80648891ccc6e5db8a38e35394ee917db6a1ea32 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 28 May 2000 20:34:52 +0000 Subject: [PATCH] Miscellaneous cleanups of places that needed to account for new pg_language entries. --- src/backend/commands/remove.c | 5 +-- src/backend/commands/trigger.c | 17 +++++---- src/bin/pg_dump/pg_dump.c | 63 ++++++++++++---------------------- src/include/nodes/parsenodes.h | 4 +-- 4 files changed, 36 insertions(+), 53 deletions(-) diff --git a/src/backend/commands/remove.c b/src/backend/commands/remove.c index 03b74549ee..a90af396a0 100644 --- a/src/backend/commands/remove.c +++ b/src/backend/commands/remove.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.48 2000/05/18 16:09:38 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.49 2000/05/28 20:34:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -367,7 +367,8 @@ RemoveFunction(char *functionName, /* function name to be removed */ func_error("RemoveFunction", functionName, nargs, argList, NULL); } - if ((((Form_pg_proc) GETSTRUCT(tup))->prolang) == INTERNALlanguageId) + if (((Form_pg_proc) GETSTRUCT(tup))->prolang == INTERNALlanguageId || + ((Form_pg_proc) GETSTRUCT(tup))->prolang == NEWINTERNALlanguageId) { heap_close(relation, RowExclusiveLock); elog(NOTICE, "Removing built-in function \"%s\"", functionName); diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 49f5570e8f..4deb755404 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.65 2000/05/28 17:55:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.66 2000/05/28 20:34:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -58,6 +58,7 @@ CreateTrigger(CreateTrigStmt *stmt) Relation idescs[Num_pg_trigger_indices]; Relation ridescs[Num_pg_class_indices]; Oid fargtypes[FUNC_MAX_ARGS]; + Oid funclang; int found = 0; int i; char constrtrigname[NAMEDATALEN]; @@ -154,24 +155,26 @@ CreateTrigger(CreateTrigStmt *stmt) Int32GetDatum(0), PointerGetDatum(fargtypes), 0); - if (!HeapTupleIsValid(tuple) || - ((Form_pg_proc) GETSTRUCT(tuple))->pronargs != 0) + if (!HeapTupleIsValid(tuple)) elog(ERROR, "CreateTrigger: function %s() does not exist", stmt->funcname); if (((Form_pg_proc) GETSTRUCT(tuple))->prorettype != 0) elog(ERROR, "CreateTrigger: function %s() must return OPAQUE", stmt->funcname); - if (((Form_pg_proc) GETSTRUCT(tuple))->prolang != ClanguageId && - ((Form_pg_proc) GETSTRUCT(tuple))->prolang != INTERNALlanguageId) + funclang = ((Form_pg_proc) GETSTRUCT(tuple))->prolang; + if (funclang != ClanguageId && + funclang != NEWClanguageId && + funclang != INTERNALlanguageId && + funclang != NEWINTERNALlanguageId) { HeapTuple langTup; langTup = SearchSysCacheTuple(LANGOID, - ObjectIdGetDatum(((Form_pg_proc) GETSTRUCT(tuple))->prolang), + ObjectIdGetDatum(funclang), 0, 0, 0); if (!HeapTupleIsValid(langTup)) elog(ERROR, "CreateTrigger: cache lookup for PL %u failed", - ((Form_pg_proc) GETSTRUCT(tuple))->prolang); + funclang); if (((Form_pg_language) GETSTRUCT(langTup))->lanispl == false) elog(ERROR, "CreateTrigger: only builtin, C and PL functions are supported"); } diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index b6b218bdc7..12eed92452 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -22,7 +22,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.147 2000/04/14 01:34:24 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.148 2000/05/28 20:34:52 tgl Exp $ * * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * @@ -2575,6 +2575,10 @@ dumpOneFunc(FILE *fout, FuncInfo *finfo, int i, int j; char *func_def; char func_lang[NAMEDATALEN + 1]; + PGresult *res; + int nlangs; + int i_lanname; + char query[256]; if (finfo[i].dumped) return; @@ -2583,54 +2587,29 @@ dumpOneFunc(FILE *fout, FuncInfo *finfo, int i, becomeUser(fout, finfo[i].usename); - if (finfo[i].lang == INTERNALlanguageId) + sprintf(query, "SELECT lanname FROM pg_language WHERE oid = %u", + finfo[i].lang); + res = PQexec(g_conn, query); + if (!res || + PQresultStatus(res) != PGRES_TUPLES_OK) { - func_def = finfo[i].prosrc; - strcpy(func_lang, "INTERNAL"); + fprintf(stderr, "dumpOneFunc(): SELECT for procedural language failed. Explanation from backend: '%s'.\n", PQerrorMessage(g_conn)); + exit_nicely(g_conn); } - else if (finfo[i].lang == ClanguageId) + nlangs = PQntuples(res); + + if (nlangs != 1) { - func_def = finfo[i].probin; - strcpy(func_lang, "C"); + fprintf(stderr, "dumpOneFunc(): procedural language for function %s not found\n", finfo[i].proname); + exit_nicely(g_conn); } - else if (finfo[i].lang == SQLlanguageId) - { - func_def = finfo[i].prosrc; - strcpy(func_lang, "SQL"); - } - else - { - PGresult *res; - int nlangs; - int i_lanname; - char query[256]; - sprintf(query, "SELECT lanname FROM pg_language " - "WHERE oid = %u", - finfo[i].lang); - res = PQexec(g_conn, query); - if (!res || - PQresultStatus(res) != PGRES_TUPLES_OK) - { - fprintf(stderr, "dumpOneFunc(): SELECT for procedural language failed. Explanation from backend: '%s'.\n", PQerrorMessage(g_conn)); - exit_nicely(g_conn); - } - nlangs = PQntuples(res); + i_lanname = PQfnumber(res, "lanname"); - if (nlangs != 1) - { - fprintf(stderr, "dumpOneFunc(): procedural language for function %s not found\n", finfo[i].proname); - exit_nicely(g_conn); - } + func_def = finfo[i].prosrc; + strcpy(func_lang, PQgetvalue(res, 0, i_lanname)); - i_lanname = PQfnumber(res, "lanname"); - - func_def = finfo[i].prosrc; - strcpy(func_lang, PQgetvalue(res, 0, i_lanname)); - - PQclear(res); - - } + PQclear(res); if (dropSchema) { diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 15c370a64a..54c5768832 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: parsenodes.h,v 1.104 2000/04/12 17:16:40 momjian Exp $ + * $Id: parsenodes.h,v 1.105 2000/05/28 20:34:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -248,7 +248,7 @@ typedef struct CreateTrigStmt bool before; /* BEFORE/AFTER */ bool row; /* ROW/STATEMENT */ char actions[4]; /* Insert, Update, Delete */ - char *lang; /* NULL (which means Clanguage) */ + char *lang; /* currently not used, always NULL */ char *text; /* AS 'text' */ List *attr; /* UPDATE OF a, b,... (NI) or NULL */ char *when; /* WHEN 'a > 10 ...' (NI) or NULL */