Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 996659f

Browse files
committed
Fix handling of type tuple associated with a temp relation. We have
to apply the tempname->realname mapping to type name lookup as well as relation name lookup, else the type tuple will not be found when wanted. This fixes bugs like this one: create temp table foo (f1 int); select foo.f2 from foo; ERROR: Unable to locate type name 'foo' in catalog
1 parent a1dfaef commit 996659f

File tree

2 files changed

+42
-33
lines changed

2 files changed

+42
-33
lines changed

src/backend/parser/parse_relation.c

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.43 2000/06/12 19:40:42 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.44 2000/06/20 01:41:21 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
1515
#include <ctype.h>
1616

1717
#include "postgres.h"
18+
1819
#include "access/heapam.h"
1920
#include "access/htup.h"
2021
#include "catalog/pg_type.h"
@@ -27,43 +28,39 @@
2728
#include "utils/lsyscache.h"
2829

2930

31+
/*
32+
* Information defining the "system" attributes of every relation.
33+
*/
3034
static struct
3135
{
32-
char *field;
33-
int code;
36+
char *attrname; /* name of system attribute */
37+
int attrnum; /* its attribute number (always < 0) */
38+
Oid attrtype; /* its type id */
3439
} special_attr[] =
3540

3641
{
3742
{
38-
"ctid", SelfItemPointerAttributeNumber
43+
"ctid", SelfItemPointerAttributeNumber, TIDOID
3944
},
4045
{
41-
"oid", ObjectIdAttributeNumber
46+
"oid", ObjectIdAttributeNumber, OIDOID
4247
},
4348
{
44-
"xmin", MinTransactionIdAttributeNumber
49+
"xmin", MinTransactionIdAttributeNumber, XIDOID
4550
},
4651
{
47-
"cmin", MinCommandIdAttributeNumber
52+
"cmin", MinCommandIdAttributeNumber, CIDOID
4853
},
4954
{
50-
"xmax", MaxTransactionIdAttributeNumber
55+
"xmax", MaxTransactionIdAttributeNumber, XIDOID
5156
},
5257
{
53-
"cmax", MaxCommandIdAttributeNumber
58+
"cmax", MaxCommandIdAttributeNumber, CIDOID
5459
},
5560
};
5661

57-
#define SPECIALS ((int) (sizeof(special_attr)/sizeof(*special_attr)))
62+
#define SPECIALS ((int) (sizeof(special_attr)/sizeof(special_attr[0])))
5863

59-
static char *attnum_type[SPECIALS] = {
60-
"tid",
61-
"oid",
62-
"xid",
63-
"cid",
64-
"xid",
65-
"cid",
66-
};
6764

6865
#ifdef NOT_USED
6966
/* refnameRangeTableEntries()
@@ -459,8 +456,8 @@ specialAttNum(char *a)
459456
int i;
460457

461458
for (i = 0; i < SPECIALS; i++)
462-
if (!strcmp(special_attr[i].field, a))
463-
return special_attr[i].code;
459+
if (strcmp(special_attr[i].attrname, a) == 0)
460+
return special_attr[i].attrnum;
464461

465462
return InvalidAttrNumber;
466463
}
@@ -485,10 +482,8 @@ attnameIsSet(Relation rd, char *name)
485482
/* First check if this is a system attribute */
486483
for (i = 0; i < SPECIALS; i++)
487484
{
488-
if (!strcmp(special_attr[i].field, name))
489-
{
485+
if (strcmp(special_attr[i].attrname, name) == 0)
490486
return false; /* no sys attr is a set */
491-
}
492487
}
493488
return get_attisset(RelationGetRelid(rd), name);
494489
}
@@ -516,13 +511,21 @@ attnumAttNelems(Relation rd, int attid)
516511
Oid
517512
attnumTypeId(Relation rd, int attid)
518513
{
519-
520514
if (attid < 0)
521-
return typeTypeId(typenameType(attnum_type[-attid - 1]));
515+
{
516+
int i;
517+
518+
for (i = 0; i < SPECIALS; i++)
519+
{
520+
if (special_attr[i].attrnum == attid)
521+
return special_attr[i].attrtype;
522+
}
523+
/* negative but not a valid system attr? */
524+
elog(ERROR, "attnumTypeId: bogus attribute number %d", attid);
525+
}
522526

523527
/*
524-
* -1 because varattno (where attid comes from) returns one more than
525-
* index
528+
* -1 because attid is 1-based
526529
*/
527530
return rd->rd_att->attrs[attid - 1]->atttypid;
528531
}

src/backend/utils/cache/syscache.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.54 2000/06/17 04:56:33 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/utils/cache/syscache.c,v 1.55 2000/06/20 01:41:22 tgl Exp $
1212
*
1313
* NOTES
1414
* These routines allow the parser/planner/executor to perform
@@ -482,14 +482,20 @@ SearchSysCacheTuple(int cacheId,/* cache selection code */
482482
cacheId);
483483
}
484484

485-
/* temp table name remapping */
486-
if (cacheId == RELNAME)
485+
/*
486+
* If someone tries to look up a relname, translate temp relation
487+
* names to real names. Less obviously, apply the same translation
488+
* to type names, so that the type tuple of a temp table will be found
489+
* when sought. This is a kluge ... temp table substitution should be
490+
* happening at a higher level ...
491+
*/
492+
if (cacheId == RELNAME || cacheId == TYPENAME)
487493
{
488494
char *nontemp_relname;
489495

490-
if ((nontemp_relname =
491-
get_temp_rel_by_username(DatumGetPointer(key1))) != NULL)
492-
key1 = PointerGetDatum(nontemp_relname);
496+
nontemp_relname = get_temp_rel_by_username(DatumGetCString(key1));
497+
if (nontemp_relname != NULL)
498+
key1 = CStringGetDatum(nontemp_relname);
493499
}
494500

495501
tp = SearchSysCache(SysCache[cacheId], key1, key2, key3, key4);

0 commit comments

Comments
 (0)