diff options
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/aggregatecmds.c | 8 | ||||
-rw-r--r-- | src/backend/commands/comment.c | 8 | ||||
-rw-r--r-- | src/backend/commands/functioncmds.c | 36 | ||||
-rw-r--r-- | src/backend/commands/opclasscmds.c | 10 | ||||
-rw-r--r-- | src/backend/commands/operatorcmds.c | 6 | ||||
-rw-r--r-- | src/backend/commands/prepare.c | 4 | ||||
-rw-r--r-- | src/backend/commands/tablecmds.c | 23 | ||||
-rw-r--r-- | src/backend/commands/typecmds.c | 57 |
8 files changed, 75 insertions, 77 deletions
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index 89ea00d89a6..e49a7da3a29 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -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, diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 89158251aa4..c175523c36b 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -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), diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 9e5d0b1095b..3a556615026 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -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), diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 12bca5119fe..cc15e2b2cdb 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -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; diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index dd872d6a642..8de6b4bebfd 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -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.. diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 38055997faa..0a7f5653167 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -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; } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 0af90cb4ac6..23f36193690 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -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 diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 1f58d989f26..230004c59bb 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -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())) |