mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Split out CreateCast into src/backend/catalog/pg_cast.c
This catalog-handling code was previously together with the rest of CastCreate() in src/backend/commands/functioncmds.c. A future patch will need a way to add casts internally, so this will be useful to have separate. Also, move the nearby get_cast_oid() function from functioncmds.c to lsyscache.c, which seems a more natural place for it. Author: Paul Jungwirth, minor edits by Álvaro Discussion: https://postgr.es/m/20200309210003.GA19992@alvherre.pgsql
This commit is contained in:
@ -1411,17 +1411,12 @@ CreateCast(CreateCastStmt *stmt)
|
||||
char sourcetyptype;
|
||||
char targettyptype;
|
||||
Oid funcid;
|
||||
Oid castid;
|
||||
int nargs;
|
||||
char castcontext;
|
||||
char castmethod;
|
||||
Relation relation;
|
||||
HeapTuple tuple;
|
||||
Datum values[Natts_pg_cast];
|
||||
bool nulls[Natts_pg_cast];
|
||||
ObjectAddress myself,
|
||||
referenced;
|
||||
AclResult aclresult;
|
||||
ObjectAddress myself;
|
||||
|
||||
sourcetypeid = typenameTypeId(NULL, stmt->sourcetype);
|
||||
targettypeid = typenameTypeId(NULL, stmt->targettype);
|
||||
@ -1645,100 +1640,11 @@ CreateCast(CreateCastStmt *stmt)
|
||||
break;
|
||||
}
|
||||
|
||||
relation = table_open(CastRelationId, RowExclusiveLock);
|
||||
|
||||
/*
|
||||
* Check for duplicate. This is just to give a friendly error message,
|
||||
* the unique index would catch it anyway (so no need to sweat about race
|
||||
* conditions).
|
||||
*/
|
||||
tuple = SearchSysCache2(CASTSOURCETARGET,
|
||||
ObjectIdGetDatum(sourcetypeid),
|
||||
ObjectIdGetDatum(targettypeid));
|
||||
if (HeapTupleIsValid(tuple))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_OBJECT),
|
||||
errmsg("cast from type %s to type %s already exists",
|
||||
format_type_be(sourcetypeid),
|
||||
format_type_be(targettypeid))));
|
||||
|
||||
/* ready to go */
|
||||
castid = GetNewOidWithIndex(relation, CastOidIndexId, Anum_pg_cast_oid);
|
||||
values[Anum_pg_cast_oid - 1] = ObjectIdGetDatum(castid);
|
||||
values[Anum_pg_cast_castsource - 1] = ObjectIdGetDatum(sourcetypeid);
|
||||
values[Anum_pg_cast_casttarget - 1] = ObjectIdGetDatum(targettypeid);
|
||||
values[Anum_pg_cast_castfunc - 1] = ObjectIdGetDatum(funcid);
|
||||
values[Anum_pg_cast_castcontext - 1] = CharGetDatum(castcontext);
|
||||
values[Anum_pg_cast_castmethod - 1] = CharGetDatum(castmethod);
|
||||
|
||||
MemSet(nulls, false, sizeof(nulls));
|
||||
|
||||
tuple = heap_form_tuple(RelationGetDescr(relation), values, nulls);
|
||||
|
||||
CatalogTupleInsert(relation, tuple);
|
||||
|
||||
/* make dependency entries */
|
||||
myself.classId = CastRelationId;
|
||||
myself.objectId = castid;
|
||||
myself.objectSubId = 0;
|
||||
|
||||
/* dependency on source type */
|
||||
referenced.classId = TypeRelationId;
|
||||
referenced.objectId = sourcetypeid;
|
||||
referenced.objectSubId = 0;
|
||||
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
|
||||
|
||||
/* dependency on target type */
|
||||
referenced.classId = TypeRelationId;
|
||||
referenced.objectId = targettypeid;
|
||||
referenced.objectSubId = 0;
|
||||
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
|
||||
|
||||
/* dependency on function */
|
||||
if (OidIsValid(funcid))
|
||||
{
|
||||
referenced.classId = ProcedureRelationId;
|
||||
referenced.objectId = funcid;
|
||||
referenced.objectSubId = 0;
|
||||
recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
|
||||
}
|
||||
|
||||
/* dependency on extension */
|
||||
recordDependencyOnCurrentExtension(&myself, false);
|
||||
|
||||
/* Post creation hook for new cast */
|
||||
InvokeObjectPostCreateHook(CastRelationId, castid, 0);
|
||||
|
||||
heap_freetuple(tuple);
|
||||
|
||||
table_close(relation, RowExclusiveLock);
|
||||
|
||||
myself = CastCreate(sourcetypeid, targettypeid, funcid, castcontext,
|
||||
castmethod, DEPENDENCY_NORMAL);
|
||||
return myself;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_cast_oid - given two type OIDs, look up a cast OID
|
||||
*
|
||||
* If missing_ok is false, throw an error if the cast is not found. If
|
||||
* true, just return InvalidOid.
|
||||
*/
|
||||
Oid
|
||||
get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok)
|
||||
{
|
||||
Oid oid;
|
||||
|
||||
oid = GetSysCacheOid2(CASTSOURCETARGET, Anum_pg_cast_oid,
|
||||
ObjectIdGetDatum(sourcetypeid),
|
||||
ObjectIdGetDatum(targettypeid));
|
||||
if (!OidIsValid(oid) && !missing_ok)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_UNDEFINED_OBJECT),
|
||||
errmsg("cast from type %s to type %s does not exist",
|
||||
format_type_be(sourcetypeid),
|
||||
format_type_be(targettypeid))));
|
||||
return oid;
|
||||
}
|
||||
|
||||
void
|
||||
DropCastById(Oid castOid)
|
||||
{
|
||||
|
@ -42,6 +42,7 @@
|
||||
#include "catalog/objectaccess.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_authid.h"
|
||||
#include "catalog/pg_cast.h"
|
||||
#include "catalog/pg_collation.h"
|
||||
#include "catalog/pg_constraint.h"
|
||||
#include "catalog/pg_depend.h"
|
||||
|
Reference in New Issue
Block a user