-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.1 2002/07/18 23:11:27 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.2 2002/08/11 17:44:12 petere Exp $ -->
<refentry id="SQL-CREATECAST">
<refmeta>
</para>
<para>
- To be able to create a cast, you must own the underlying function.
- To be able to create a binary compatible cast, you must own both
- the source and the target data type.
+ To be able to create a cast, you must own the source or the target
+ data type.
</para>
<variablelist>
</para>
<para>
- The privileges required to create a cast may be changed in a future
- release.
- </para>
-
- <para>
Remember that if you want to be able to convert types both ways you
need to declare casts both ways explicitly.
</para>
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_cast.sgml,v 1.1 2002/07/18 23:11:27 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/drop_cast.sgml,v 1.2 2002/08/11 17:44:12 petere Exp $ -->
<refentry id="SQL-DROPCAST">
<refmeta>
</para>
<para>
- To be able to drop a cast, you must own the underlying function.
- To be able to drop a binary compatible cast, you must own both the
- source and the target data type. These are the same privileges
- that are required to create a cast.
+ To be able to drop a cast, you must own the source or the target
+ data type. These are the same privileges that are required to
+ create a cast.
</para>
<variablelist>
<para>
Use <command>CREATE CAST</command> to create user-defined casts.
</para>
-
- <para>
- The privileges required to drop a cast may be changed in a future
- release.
- </para>
</refsect1>
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.16 2002/08/05 03:29:16 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.17 2002/08/11 17:44:12 petere Exp $
*
* DESCRIPTION
* These routines take the parse tree and pick out the
if (sourcetypeid == targettypeid)
elog(ERROR, "source data type and target data type are the same");
+ if (!pg_type_ownercheck(sourcetypeid, GetUserId())
+ && !pg_type_ownercheck(targettypeid, GetUserId()))
+ elog(ERROR, "must be owner of type %s or type %s",
+ TypeNameToString(stmt->sourcetype),
+ TypeNameToString(stmt->targettype));
+
relation = heap_openr(CastRelationName, RowExclusiveLock);
tuple = SearchSysCache(CASTSOURCETARGET,
false,
"CreateCast");
- if (!pg_proc_ownercheck(funcid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER,
- NameListToString(stmt->func->funcname));
-
tuple = SearchSysCache(PROCOID, ObjectIdGetDatum(funcid), 0, 0, 0);
if (!HeapTupleIsValid(tuple))
elog(ERROR, "cache lookup of function %u failed", funcid);
else
{
/* indicates binary compatibility */
- if (!pg_type_ownercheck(sourcetypeid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER,
- TypeNameToString(stmt->sourcetype));
- if (!pg_type_ownercheck(targettypeid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER,
- TypeNameToString(stmt->targettype));
funcid = InvalidOid;
}
Oid sourcetypeid;
Oid targettypeid;
HeapTuple tuple;
- Form_pg_cast caststruct;
ObjectAddress object;
sourcetypeid = LookupTypeName(stmt->sourcetype);
TypeNameToString(stmt->targettype));
/* Permission check */
- caststruct = (Form_pg_cast) GETSTRUCT(tuple);
- if (caststruct->castfunc != InvalidOid)
- {
- if (!pg_proc_ownercheck(caststruct->castfunc, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER,
- get_func_name(caststruct->castfunc));
- }
- else
- {
- if (!pg_type_ownercheck(sourcetypeid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER,
- format_type_be(sourcetypeid));
- if (!pg_type_ownercheck(targettypeid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER,
- format_type_be(targettypeid));
- }
+ if (!pg_type_ownercheck(sourcetypeid, GetUserId())
+ && !pg_type_ownercheck(targettypeid, GetUserId()))
+ elog(ERROR, "must be owner of type %s or type %s",
+ TypeNameToString(stmt->sourcetype),
+ TypeNameToString(stmt->targettype));
/*
* Do the deletion