aboutsummaryrefslogtreecommitdiff
path: root/src/pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/pl')
-rw-r--r--src/pl/plpgsql/src/pl_comp.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index 0e9ca176ac4..44c5146eb63 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.38 2002/03/06 06:10:45 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.39 2002/03/26 19:17:02 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -46,6 +46,7 @@
#include "access/heapam.h"
#include "catalog/catname.h"
+#include "catalog/namespace.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"
#include "catalog/pg_class.h"
@@ -941,6 +942,7 @@ plpgsql_parse_dblwordtype(char *string)
char *word2;
PLpgSQL_nsitem *nse;
bool old_nsstate;
+ Oid classOid;
HeapTuple classtup;
Form_pg_class classStruct;
HeapTuple attrtup;
@@ -998,8 +1000,14 @@ plpgsql_parse_dblwordtype(char *string)
/*
* First word could also be a table name
*/
- classtup = SearchSysCache(RELNAME,
- PointerGetDatum(word1),
+ classOid = RelnameGetRelid(word1);
+ if (!OidIsValid(classOid))
+ {
+ pfree(word1);
+ return T_ERROR;
+ }
+ classtup = SearchSysCache(RELOID,
+ ObjectIdGetDatum(classOid),
0, 0, 0);
if (!HeapTupleIsValid(classtup))
{
@@ -1024,7 +1032,7 @@ plpgsql_parse_dblwordtype(char *string)
* Fetch the named table field and it's type
*/
attrtup = SearchSysCache(ATTNAME,
- ObjectIdGetDatum(classtup->t_data->t_oid),
+ ObjectIdGetDatum(classOid),
PointerGetDatum(word2),
0, 0);
if (!HeapTupleIsValid(attrtup))
@@ -1049,7 +1057,7 @@ plpgsql_parse_dblwordtype(char *string)
typ = (PLpgSQL_type *) malloc(sizeof(PLpgSQL_type));
typ->typname = strdup(NameStr(typeStruct->typname));
- typ->typoid = typetup->t_data->t_oid;
+ typ->typoid = attrStruct->atttypid;
perm_fmgr_info(typeStruct->typinput, &(typ->typinput));
typ->typelem = typeStruct->typelem;
typ->typbyval = typeStruct->typbyval;
@@ -1074,6 +1082,7 @@ plpgsql_parse_dblwordtype(char *string)
int
plpgsql_parse_wordrowtype(char *string)
{
+ Oid classOid;
HeapTuple classtup;
Form_pg_class classStruct;
HeapTuple typetup;
@@ -1093,8 +1102,11 @@ plpgsql_parse_wordrowtype(char *string)
cp = strchr(word1, '%');
*cp = '\0';
- classtup = SearchSysCache(RELNAME,
- PointerGetDatum(word1),
+ classOid = RelnameGetRelid(word1);
+ if (!OidIsValid(classOid))
+ elog(ERROR, "%s: no such class", word1);
+ classtup = SearchSysCache(RELOID,
+ ObjectIdGetDatum(classOid),
0, 0, 0);
if (!HeapTupleIsValid(classtup))
elog(ERROR, "%s: no such class", word1);
@@ -1106,15 +1118,6 @@ plpgsql_parse_wordrowtype(char *string)
elog(ERROR, "%s isn't a table", word1);
/*
- * Fetch the table's pg_type tuple too
- */
- typetup = SearchSysCache(TYPENAME,
- PointerGetDatum(word1),
- 0, 0, 0);
- if (!HeapTupleIsValid(typetup))
- elog(ERROR, "cache lookup for %s in pg_type failed", word1);
-
- /*
* Create a row datum entry and all the required variables that it
* will point to.
*/
@@ -1123,19 +1126,17 @@ plpgsql_parse_wordrowtype(char *string)
row->dtype = PLPGSQL_DTYPE_ROW;
row->nfields = classStruct->relnatts;
- row->rowtypeclass = typetup->t_data->t_oid;
+ row->rowtypeclass = classStruct->reltype;
row->fieldnames = malloc(sizeof(char *) * row->nfields);
row->varnos = malloc(sizeof(int) * row->nfields);
- ReleaseSysCache(typetup);
-
for (i = 0; i < row->nfields; i++)
{
/*
* Get the attribute and it's type
*/
attrtup = SearchSysCache(ATTNUM,
- ObjectIdGetDatum(classtup->t_data->t_oid),
+ ObjectIdGetDatum(classOid),
Int16GetDatum(i + 1),
0, 0);
if (!HeapTupleIsValid(attrtup))
@@ -1172,7 +1173,7 @@ plpgsql_parse_wordrowtype(char *string)
strcat(var->refname, cp);
var->datatype = malloc(sizeof(PLpgSQL_type));
var->datatype->typname = strdup(NameStr(typeStruct->typname));
- var->datatype->typoid = typetup->t_data->t_oid;
+ var->datatype->typoid = attrStruct->atttypid;
perm_fmgr_info(typeStruct->typinput, &(var->datatype->typinput));
var->datatype->typelem = typeStruct->typelem;
var->datatype->typbyval = typeStruct->typbyval;