mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Ensure that typmod decoration on a datatype name is validated in all cases,
even in code paths where we don't pay any subsequent attention to the typmod value. This seems needed in view of the fact that 8.3's generalized typmod support will accept a lot of bogus syntax, such as "timestamp(foo)" or "record(int, 42)" --- if we allow such things to pass without comment, users will get confused. Per a recent example from Greg Stark. To implement this in a way that's not very vulnerable to future bugs-of-omission, refactor the API of parse_type.c's TypeName lookup routines so that typmod validation is folded into the base lookup operation. Callers can still choose not to receive the encoded typmod, but we'll check the decoration anyway if it's present.
This commit is contained in:
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.43 2007/04/02 03:49:37 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.44 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
* The "DefineFoo" routines take the parse tree and pick out the
|
||||
@ -142,7 +142,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
|
||||
{
|
||||
numArgs = 1;
|
||||
aggArgTypes = (Oid *) palloc(sizeof(Oid));
|
||||
aggArgTypes[0] = typenameTypeId(NULL, baseType);
|
||||
aggArgTypes[0] = typenameTypeId(NULL, baseType, NULL);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -164,7 +164,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
|
||||
{
|
||||
TypeName *curTypeName = (TypeName *) lfirst(lc);
|
||||
|
||||
aggArgTypes[i++] = typenameTypeId(NULL, curTypeName);
|
||||
aggArgTypes[i++] = typenameTypeId(NULL, curTypeName, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,7 +175,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
|
||||
* values of the transtype. However, we can allow polymorphic transtype
|
||||
* in some cases (AggregateCreate will check).
|
||||
*/
|
||||
transTypeId = typenameTypeId(NULL, transType);
|
||||
transTypeId = typenameTypeId(NULL, transType, NULL);
|
||||
if (get_typtype(transTypeId) == TYPTYPE_PSEUDO &&
|
||||
!IsPolymorphicType(transTypeId))
|
||||
ereport(ERROR,
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Copyright (c) 1996-2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.97 2007/08/21 01:11:14 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.98 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -874,7 +874,7 @@ CommentType(List *typename, char *comment)
|
||||
|
||||
/* Find the type's oid */
|
||||
|
||||
oid = typenameTypeId(NULL, tname);
|
||||
oid = typenameTypeId(NULL, tname, NULL);
|
||||
|
||||
/* Check object security */
|
||||
|
||||
@ -1451,8 +1451,8 @@ CommentCast(List *qualname, List *arguments, char *comment)
|
||||
targettype = (TypeName *) linitial(arguments);
|
||||
Assert(IsA(targettype, TypeName));
|
||||
|
||||
sourcetypeid = typenameTypeId(NULL, sourcetype);
|
||||
targettypeid = typenameTypeId(NULL, targettype);
|
||||
sourcetypeid = typenameTypeId(NULL, sourcetype, NULL);
|
||||
targettypeid = typenameTypeId(NULL, targettype, NULL);
|
||||
|
||||
tuple = SearchSysCache(CASTSOURCETARGET,
|
||||
ObjectIdGetDatum(sourcetypeid),
|
||||
|
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.85 2007/09/03 18:46:29 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.86 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
* These routines take the parse tree and pick out the
|
||||
@ -76,12 +76,13 @@ compute_return_type(TypeName *returnType, Oid languageOid,
|
||||
Oid *prorettype_p, bool *returnsSet_p)
|
||||
{
|
||||
Oid rettype;
|
||||
Type typtup;
|
||||
|
||||
rettype = LookupTypeName(NULL, returnType);
|
||||
typtup = LookupTypeName(NULL, returnType, NULL);
|
||||
|
||||
if (OidIsValid(rettype))
|
||||
if (typtup)
|
||||
{
|
||||
if (!get_typisdefined(rettype))
|
||||
if (!((Form_pg_type) GETSTRUCT(typtup))->typisdefined)
|
||||
{
|
||||
if (languageOid == SQLlanguageId)
|
||||
ereport(ERROR,
|
||||
@ -94,6 +95,8 @@ compute_return_type(TypeName *returnType, Oid languageOid,
|
||||
errmsg("return type %s is only a shell",
|
||||
TypeNameToString(returnType))));
|
||||
}
|
||||
rettype = typeTypeId(typtup);
|
||||
ReleaseSysCache(typtup);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -114,6 +117,13 @@ compute_return_type(TypeName *returnType, Oid languageOid,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("type \"%s\" does not exist", typnam)));
|
||||
|
||||
/* Reject if there's typmod decoration, too */
|
||||
if (returnType->typmods != NIL)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("type modifier cannot be specified for shell type \"%s\"",
|
||||
typnam)));
|
||||
|
||||
/* Otherwise, go ahead and make a shell type */
|
||||
ereport(NOTICE,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
@ -175,11 +185,12 @@ examine_parameter_list(List *parameters, Oid languageOid,
|
||||
FunctionParameter *fp = (FunctionParameter *) lfirst(x);
|
||||
TypeName *t = fp->argType;
|
||||
Oid toid;
|
||||
Type typtup;
|
||||
|
||||
toid = LookupTypeName(NULL, t);
|
||||
if (OidIsValid(toid))
|
||||
typtup = LookupTypeName(NULL, t, NULL);
|
||||
if (typtup)
|
||||
{
|
||||
if (!get_typisdefined(toid))
|
||||
if (!((Form_pg_type) GETSTRUCT(typtup))->typisdefined)
|
||||
{
|
||||
/* As above, hard error if language is SQL */
|
||||
if (languageOid == SQLlanguageId)
|
||||
@ -193,6 +204,8 @@ examine_parameter_list(List *parameters, Oid languageOid,
|
||||
errmsg("argument type %s is only a shell",
|
||||
TypeNameToString(t))));
|
||||
}
|
||||
toid = typeTypeId(typtup);
|
||||
ReleaseSysCache(typtup);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -200,6 +213,7 @@ examine_parameter_list(List *parameters, Oid languageOid,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("type %s does not exist",
|
||||
TypeNameToString(t))));
|
||||
toid = InvalidOid; /* keep compiler quiet */
|
||||
}
|
||||
|
||||
if (t->setof)
|
||||
@ -1341,8 +1355,8 @@ CreateCast(CreateCastStmt *stmt)
|
||||
ObjectAddress myself,
|
||||
referenced;
|
||||
|
||||
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype);
|
||||
targettypeid = typenameTypeId(NULL, stmt->targettype);
|
||||
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype, NULL);
|
||||
targettypeid = typenameTypeId(NULL, stmt->targettype, NULL);
|
||||
|
||||
/* No pseudo-types allowed */
|
||||
if (get_typtype(sourcetypeid) == TYPTYPE_PSEUDO)
|
||||
@ -1567,8 +1581,8 @@ DropCast(DropCastStmt *stmt)
|
||||
ObjectAddress object;
|
||||
|
||||
/* when dropping a cast, the types must exist even if you use IF EXISTS */
|
||||
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype);
|
||||
targettypeid = typenameTypeId(NULL, stmt->targettype);
|
||||
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype, NULL);
|
||||
targettypeid = typenameTypeId(NULL, stmt->targettype, NULL);
|
||||
|
||||
tuple = SearchSysCache(CASTSOURCETARGET,
|
||||
ObjectIdGetDatum(sourcetypeid),
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.54 2007/02/01 19:10:26 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.55 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -327,7 +327,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
|
||||
errmsg("must be superuser to create an operator class")));
|
||||
|
||||
/* Look up the datatype */
|
||||
typeoid = typenameTypeId(NULL, stmt->datatype);
|
||||
typeoid = typenameTypeId(NULL, stmt->datatype, NULL);
|
||||
|
||||
#ifdef NOT_USED
|
||||
/* XXX this is unnecessary given the superuser check above */
|
||||
@ -481,7 +481,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||
errmsg("storage type specified more than once")));
|
||||
storageoid = typenameTypeId(NULL, item->storedtype);
|
||||
storageoid = typenameTypeId(NULL, item->storedtype, NULL);
|
||||
|
||||
#ifdef NOT_USED
|
||||
/* XXX this is unnecessary given the superuser check above */
|
||||
@ -1035,12 +1035,12 @@ processTypesSpec(List *args, Oid *lefttype, Oid *righttype)
|
||||
Assert(args != NIL);
|
||||
|
||||
typeName = (TypeName *) linitial(args);
|
||||
*lefttype = typenameTypeId(NULL, typeName);
|
||||
*lefttype = typenameTypeId(NULL, typeName, NULL);
|
||||
|
||||
if (list_length(args) > 1)
|
||||
{
|
||||
typeName = (TypeName *) lsecond(args);
|
||||
*righttype = typenameTypeId(NULL, typeName);
|
||||
*righttype = typenameTypeId(NULL, typeName, NULL);
|
||||
}
|
||||
else
|
||||
*righttype = *lefttype;
|
||||
|
@ -9,7 +9,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.36 2007/06/02 23:36:35 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/operatorcmds.c,v 1.37 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
* The "DefineFoo" routines take the parse tree and pick out the
|
||||
@ -149,9 +149,9 @@ DefineOperator(List *names, List *parameters)
|
||||
|
||||
/* Transform type names to type OIDs */
|
||||
if (typeName1)
|
||||
typeId1 = typenameTypeId(NULL, typeName1);
|
||||
typeId1 = typenameTypeId(NULL, typeName1, NULL);
|
||||
if (typeName2)
|
||||
typeId2 = typenameTypeId(NULL, typeName2);
|
||||
typeId2 = typenameTypeId(NULL, typeName2, NULL);
|
||||
|
||||
/*
|
||||
* now have OperatorCreate do all the work..
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Copyright (c) 2002-2007, PostgreSQL Global Development Group
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.77 2007/06/23 22:12:50 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/prepare.c,v 1.78 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -90,7 +90,7 @@ PrepareQuery(PrepareStmt *stmt, const char *queryString)
|
||||
foreach(l, stmt->argtypes)
|
||||
{
|
||||
TypeName *tn = lfirst(l);
|
||||
Oid toid = typenameTypeId(pstate, tn);
|
||||
Oid toid = typenameTypeId(pstate, tn, NULL);
|
||||
|
||||
argtypes[i++] = toid;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.234 2007/10/12 18:55:12 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.235 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -899,8 +899,7 @@ MergeAttributes(List *schema, List *supers, bool istemp,
|
||||
(errmsg("merging multiple inherited definitions of column \"%s\"",
|
||||
attributeName)));
|
||||
def = (ColumnDef *) list_nth(inhSchema, exist_attno - 1);
|
||||
defTypeId = typenameTypeId(NULL, def->typename);
|
||||
deftypmod = typenameTypeMod(NULL, def->typename, defTypeId);
|
||||
defTypeId = typenameTypeId(NULL, def->typename, &deftypmod);
|
||||
if (defTypeId != attribute->atttypid ||
|
||||
deftypmod != attribute->atttypmod)
|
||||
ereport(ERROR,
|
||||
@ -1044,10 +1043,8 @@ MergeAttributes(List *schema, List *supers, bool istemp,
|
||||
(errmsg("merging column \"%s\" with inherited definition",
|
||||
attributeName)));
|
||||
def = (ColumnDef *) list_nth(inhSchema, exist_attno - 1);
|
||||
defTypeId = typenameTypeId(NULL, def->typename);
|
||||
deftypmod = typenameTypeMod(NULL, def->typename, defTypeId);
|
||||
newTypeId = typenameTypeId(NULL, newdef->typename);
|
||||
newtypmod = typenameTypeMod(NULL, newdef->typename, newTypeId);
|
||||
defTypeId = typenameTypeId(NULL, def->typename, &deftypmod);
|
||||
newTypeId = typenameTypeId(NULL, newdef->typename, &newtypmod);
|
||||
if (defTypeId != newTypeId || deftypmod != newtypmod)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
@ -3018,8 +3015,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
int32 ctypmod;
|
||||
|
||||
/* Okay if child matches by type */
|
||||
ctypeId = typenameTypeId(NULL, colDef->typename);
|
||||
ctypmod = typenameTypeMod(NULL, colDef->typename, ctypeId);
|
||||
ctypeId = typenameTypeId(NULL, colDef->typename, &ctypmod);
|
||||
if (ctypeId != childatt->atttypid ||
|
||||
ctypmod != childatt->atttypmod)
|
||||
ereport(ERROR,
|
||||
@ -3074,10 +3070,9 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
MaxHeapAttributeNumber)));
|
||||
i = minattnum + 1;
|
||||
|
||||
typeTuple = typenameType(NULL, colDef->typename);
|
||||
typeTuple = typenameType(NULL, colDef->typename, &typmod);
|
||||
tform = (Form_pg_type) GETSTRUCT(typeTuple);
|
||||
typeOid = HeapTupleGetOid(typeTuple);
|
||||
typmod = typenameTypeMod(NULL, colDef->typename, typeOid);
|
||||
|
||||
/* make sure datatype is legal for a column */
|
||||
CheckAttributeType(colDef->colname, typeOid);
|
||||
@ -4777,8 +4772,7 @@ ATPrepAlterColumnType(List **wqueue,
|
||||
colName)));
|
||||
|
||||
/* Look up the target type */
|
||||
targettype = typenameTypeId(NULL, typename);
|
||||
targettypmod = typenameTypeMod(NULL, typename, targettype);
|
||||
targettype = typenameTypeId(NULL, typename, &targettypmod);
|
||||
|
||||
/* make sure datatype is legal for a column */
|
||||
CheckAttributeType(colName, targettype);
|
||||
@ -4905,10 +4899,9 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
|
||||
colName)));
|
||||
|
||||
/* Look up the target type (should not fail, since prep found it) */
|
||||
typeTuple = typenameType(NULL, typename);
|
||||
typeTuple = typenameType(NULL, typename, &targettypmod);
|
||||
tform = (Form_pg_type) GETSTRUCT(typeTuple);
|
||||
targettype = HeapTupleGetOid(typeTuple);
|
||||
targettypmod = typenameTypeMod(NULL, typename, targettype);
|
||||
|
||||
/*
|
||||
* If there is a default expression for the column, get it and ensure we
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.109 2007/10/29 19:40:39 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.110 2007/11/11 19:22:48 tgl Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
* The "DefineFoo" routines take the parse tree and pick out the
|
||||
@ -211,7 +211,7 @@ DefineType(List *names, List *parameters)
|
||||
}
|
||||
else if (pg_strcasecmp(defel->defname, "element") == 0)
|
||||
{
|
||||
elemType = typenameTypeId(NULL, defGetTypeName(defel));
|
||||
elemType = typenameTypeId(NULL, defGetTypeName(defel), NULL);
|
||||
/* disallow arrays of pseudotypes */
|
||||
if (get_typtype(elemType) == TYPTYPE_PSEUDO)
|
||||
ereport(ERROR,
|
||||
@ -497,8 +497,8 @@ RemoveType(List *names, DropBehavior behavior, bool missing_ok)
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
|
||||
/* Use LookupTypeName here so that shell types can be removed. */
|
||||
typeoid = LookupTypeName(NULL, typename);
|
||||
if (!OidIsValid(typeoid))
|
||||
tup = LookupTypeName(NULL, typename, NULL);
|
||||
if (tup == NULL)
|
||||
{
|
||||
if (!missing_ok)
|
||||
{
|
||||
@ -517,11 +517,7 @@ RemoveType(List *names, DropBehavior behavior, bool missing_ok)
|
||||
return;
|
||||
}
|
||||
|
||||
tup = SearchSysCache(TYPEOID,
|
||||
ObjectIdGetDatum(typeoid),
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(tup))
|
||||
elog(ERROR, "cache lookup failed for type %u", typeoid);
|
||||
typeoid = typeTypeId(tup);
|
||||
typ = (Form_pg_type) GETSTRUCT(tup);
|
||||
|
||||
/* Permission check: must own type or its namespace */
|
||||
@ -650,10 +646,9 @@ DefineDomain(CreateDomainStmt *stmt)
|
||||
/*
|
||||
* Look up the base type.
|
||||
*/
|
||||
typeTup = typenameType(NULL, stmt->typename);
|
||||
typeTup = typenameType(NULL, stmt->typename, &basetypeMod);
|
||||
baseType = (Form_pg_type) GETSTRUCT(typeTup);
|
||||
basetypeoid = HeapTupleGetOid(typeTup);
|
||||
basetypeMod = typenameTypeMod(NULL, stmt->typename, basetypeoid);
|
||||
|
||||
/*
|
||||
* Base type must be a plain base type, another domain or an enum.
|
||||
@ -946,8 +941,8 @@ RemoveDomain(List *names, DropBehavior behavior, bool missing_ok)
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
|
||||
/* Use LookupTypeName here so that shell types can be removed. */
|
||||
typeoid = LookupTypeName(NULL, typename);
|
||||
if (!OidIsValid(typeoid))
|
||||
tup = LookupTypeName(NULL, typename, NULL);
|
||||
if (tup == NULL)
|
||||
{
|
||||
if (!missing_ok)
|
||||
{
|
||||
@ -966,11 +961,7 @@ RemoveDomain(List *names, DropBehavior behavior, bool missing_ok)
|
||||
return;
|
||||
}
|
||||
|
||||
tup = SearchSysCache(TYPEOID,
|
||||
ObjectIdGetDatum(typeoid),
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(tup))
|
||||
elog(ERROR, "cache lookup failed for type %u", typeoid);
|
||||
typeoid = typeTypeId(tup);
|
||||
|
||||
/* Permission check: must own type or its namespace */
|
||||
if (!pg_type_ownercheck(typeoid, GetUserId()) &&
|
||||
@ -1443,7 +1434,7 @@ AlterDomainDefault(List *names, Node *defaultRaw)
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
domainoid = typenameTypeId(NULL, typename);
|
||||
domainoid = typenameTypeId(NULL, typename, NULL);
|
||||
|
||||
/* Look up the domain in the type table */
|
||||
rel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
@ -1573,7 +1564,7 @@ AlterDomainNotNull(List *names, bool notNull)
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
domainoid = typenameTypeId(NULL, typename);
|
||||
domainoid = typenameTypeId(NULL, typename, NULL);
|
||||
|
||||
/* Look up the domain in the type table */
|
||||
typrel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
@ -1675,7 +1666,7 @@ AlterDomainDropConstraint(List *names, const char *constrName,
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
domainoid = typenameTypeId(NULL, typename);
|
||||
domainoid = typenameTypeId(NULL, typename, NULL);
|
||||
|
||||
/* Look up the domain in the type table */
|
||||
rel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
@ -1750,7 +1741,7 @@ AlterDomainAddConstraint(List *names, Node *newConstraint)
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
domainoid = typenameTypeId(NULL, typename);
|
||||
domainoid = typenameTypeId(NULL, typename, NULL);
|
||||
|
||||
/* Look up the domain in the type table */
|
||||
typrel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
@ -2358,28 +2349,28 @@ AlterTypeOwner(List *names, Oid newOwnerId)
|
||||
Oid typeOid;
|
||||
Relation rel;
|
||||
HeapTuple tup;
|
||||
HeapTuple newtup;
|
||||
Form_pg_type typTup;
|
||||
AclResult aclresult;
|
||||
|
||||
rel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
|
||||
/* Use LookupTypeName here so that shell types can be processed */
|
||||
typeOid = LookupTypeName(NULL, typename);
|
||||
if (!OidIsValid(typeOid))
|
||||
tup = LookupTypeName(NULL, typename, NULL);
|
||||
if (tup == NULL)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("type \"%s\" does not exist",
|
||||
TypeNameToString(typename))));
|
||||
typeOid = typeTypeId(tup);
|
||||
|
||||
/* Look up the type in the type table */
|
||||
rel = heap_open(TypeRelationId, RowExclusiveLock);
|
||||
|
||||
tup = SearchSysCacheCopy(TYPEOID,
|
||||
ObjectIdGetDatum(typeOid),
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(tup))
|
||||
elog(ERROR, "cache lookup failed for type %u", typeOid);
|
||||
/* Copy the syscache entry so we can scribble on it below */
|
||||
newtup = heap_copytuple(tup);
|
||||
ReleaseSysCache(tup);
|
||||
tup = newtup;
|
||||
typTup = (Form_pg_type) GETSTRUCT(tup);
|
||||
|
||||
/*
|
||||
@ -2526,7 +2517,7 @@ AlterTypeNamespace(List *names, const char *newschema)
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeTypeNameFromNameList(names);
|
||||
typeOid = typenameTypeId(NULL, typename);
|
||||
typeOid = typenameTypeId(NULL, typename, NULL);
|
||||
|
||||
/* check permissions on type */
|
||||
if (!pg_type_ownercheck(typeOid, GetUserId()))
|
||||
|
Reference in New Issue
Block a user