]> granicus.if.org Git - postgresql/blobdiff - src/backend/catalog/pg_conversion.c
Refactor the handling of the various DropStmt variants so that when multiple
[postgresql] / src / backend / catalog / pg_conversion.c
index 5c10fa7b28cd7df12f50e41d9e95f25c8b4ce09c..753acb133df114b50b8e9b933c060eee487f2e84 100644 (file)
@@ -3,32 +3,32 @@
  * pg_conversion.c
  *       routines to support manipulation of the pg_conversion relation
  *
- * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/catalog/pg_conversion.c,v 1.14 2003/08/04 00:43:16 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.44 2008/06/14 18:04:33 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "postgres.h"
 
 #include "access/heapam.h"
-#include "catalog/catname.h"
+#include "access/sysattr.h"
 #include "catalog/dependency.h"
 #include "catalog/indexing.h"
-#include "catalog/pg_class.h"
 #include "catalog/pg_conversion.h"
-#include "catalog/namespace.h"
-#include "utils/builtins.h"
-#include "utils/lsyscache.h"
-#include "utils/syscache.h"
-#include "utils/catcache.h"
+#include "catalog/pg_conversion_fn.h"
+#include "catalog/pg_namespace.h"
+#include "catalog/pg_proc.h"
 #include "mb/pg_wchar.h"
-#include "utils/fmgroids.h"
-#include "utils/acl.h"
 #include "miscadmin.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/fmgroids.h"
+#include "utils/syscache.h"
+#include "utils/tqual.h"
 
 /*
  * ConversionCreate
@@ -37,7 +37,7 @@
  */
 Oid
 ConversionCreate(const char *conname, Oid connamespace,
-                                AclId conowner,
+                                Oid conowner,
                                 int32 conforencoding, int32 contoencoding,
                                 Oid conproc, bool def)
 {
@@ -68,21 +68,21 @@ ConversionCreate(const char *conname, Oid connamespace,
        if (def)
        {
                /*
-                * make sure there is no existing default <for encoding><to
-                * encoding> pair in this name space
+                * make sure there is no existing default <for encoding><to encoding>
+                * pair in this name space
                 */
                if (FindDefaultConversion(connamespace,
                                                                  conforencoding,
                                                                  contoencoding))
                        ereport(ERROR,
                                        (errcode(ERRCODE_DUPLICATE_OBJECT),
-                                errmsg("default conversion for %s to %s already exists",
-                                               pg_encoding_to_char(conforencoding),
-                                               pg_encoding_to_char(contoencoding))));
+                                        errmsg("default conversion for %s to %s already exists",
+                                                       pg_encoding_to_char(conforencoding),
+                                                       pg_encoding_to_char(contoencoding))));
        }
 
        /* open pg_conversion */
-       rel = heap_openr(ConversionRelationName, RowExclusiveLock);
+       rel = heap_open(ConversionRelationId, RowExclusiveLock);
        tupDesc = rel->rd_att;
 
        /* initialize nulls and values */
@@ -96,7 +96,7 @@ ConversionCreate(const char *conname, Oid connamespace,
        namestrcpy(&cname, conname);
        values[Anum_pg_conversion_conname - 1] = NameGetDatum(&cname);
        values[Anum_pg_conversion_connamespace - 1] = ObjectIdGetDatum(connamespace);
-       values[Anum_pg_conversion_conowner - 1] = Int32GetDatum(conowner);
+       values[Anum_pg_conversion_conowner - 1] = ObjectIdGetDatum(conowner);
        values[Anum_pg_conversion_conforencoding - 1] = Int32GetDatum(conforencoding);
        values[Anum_pg_conversion_contoencoding - 1] = Int32GetDatum(contoencoding);
        values[Anum_pg_conversion_conproc - 1] = ObjectIdGetDatum(conproc);
@@ -111,56 +111,32 @@ ConversionCreate(const char *conname, Oid connamespace,
        /* update the index if any */
        CatalogUpdateIndexes(rel, tup);
 
-       myself.classId = RelationGetRelid(rel);
+       myself.classId = ConversionRelationId;
        myself.objectId = HeapTupleGetOid(tup);
        myself.objectSubId = 0;
 
        /* create dependency on conversion procedure */
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = conproc;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
+       /* create dependency on namespace */
+       referenced.classId = NamespaceRelationId;
+       referenced.objectId = connamespace;
+       referenced.objectSubId = 0;
+       recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+
+       /* create dependency on owner */
+       recordDependencyOnOwner(ConversionRelationId, HeapTupleGetOid(tup),
+                                                       conowner);
+
        heap_freetuple(tup);
        heap_close(rel, RowExclusiveLock);
 
        return oid;
 }
 
-/*
- * ConversionDrop
- *
- * Drop a conversion after doing permission checks.
- */
-void
-ConversionDrop(Oid conversionOid, DropBehavior behavior)
-{
-       HeapTuple       tuple;
-       ObjectAddress object;
-
-       tuple = SearchSysCache(CONOID,
-                                                  ObjectIdGetDatum(conversionOid),
-                                                  0, 0, 0);
-       if (!HeapTupleIsValid(tuple))
-               elog(ERROR, "cache lookup failed for conversion %u", conversionOid);
-
-       if (!superuser() &&
-               ((Form_pg_conversion) GETSTRUCT(tuple))->conowner != GetUserId())
-               aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CONVERSION,
-                         NameStr(((Form_pg_conversion) GETSTRUCT(tuple))->conname));
-
-       ReleaseSysCache(tuple);
-
-       /*
-        * Do the deletion
-        */
-       object.classId = get_system_catalog_relid(ConversionRelationName);
-       object.objectId = conversionOid;
-       object.objectSubId = 0;
-
-       performDeletion(&object, behavior);
-}
-
 /*
  * RemoveConversionById
  *
@@ -171,20 +147,17 @@ void
 RemoveConversionById(Oid conversionOid)
 {
        Relation        rel;
-       TupleDesc       tupDesc;
        HeapTuple       tuple;
        HeapScanDesc scan;
        ScanKeyData scanKeyData;
 
-       ScanKeyEntryInitialize(&scanKeyData,
-                                                  0,
-                                                  ObjectIdAttributeNumber,
-                                                  F_OIDEQ,
-                                                  ObjectIdGetDatum(conversionOid));
+       ScanKeyInit(&scanKeyData,
+                               ObjectIdAttributeNumber,
+                               BTEqualStrategyNumber, F_OIDEQ,
+                               ObjectIdGetDatum(conversionOid));
 
        /* open pg_conversion */
-       rel = heap_openr(ConversionRelationName, RowExclusiveLock);
-       tupDesc = rel->rd_att;
+       rel = heap_open(ConversionRelationId, RowExclusiveLock);
 
        scan = heap_beginscan(rel, SnapshotNow,
                                                  1, &scanKeyData);
@@ -270,75 +243,3 @@ FindConversion(const char *conname, Oid connamespace)
 
        return conoid;
 }
-
-/*
- * Execute SQL99's CONVERT function.
- *
- * CONVERT <left paren> <character value expression>
- * USING <form-of-use conversion name> <right paren>
- *
- * TEXT convert_using(TEXT string, TEXT conversion_name)
- */
-Datum
-pg_convert_using(PG_FUNCTION_ARGS)
-{
-       text       *string = PG_GETARG_TEXT_P(0);
-       text       *conv_name = PG_GETARG_TEXT_P(1);
-       text       *retval;
-       List       *parsed_name;
-       Oid                     convoid;
-       HeapTuple       tuple;
-       Form_pg_conversion body;
-       unsigned char *str;
-       unsigned char *result;
-       int                     len;
-
-       /* Convert input string to null-terminated form */
-       len = VARSIZE(string) - VARHDRSZ;
-       str = palloc(len + 1);
-       memcpy(str, VARDATA(string), len);
-       *(str + len) = '\0';
-
-       /* Look up the conversion name */
-       parsed_name = textToQualifiedNameList(conv_name, "convert_using");
-       convoid = FindConversionByName(parsed_name);
-       if (!OidIsValid(convoid))
-               ereport(ERROR,
-                               (errcode(ERRCODE_UNDEFINED_OBJECT),
-                                errmsg("conversion \"%s\" does not exist",
-                                               NameListToString(parsed_name))));
-
-       tuple = SearchSysCache(CONOID,
-                                                  ObjectIdGetDatum(convoid),
-                                                  0, 0, 0);
-       if (!HeapTupleIsValid(tuple))
-               elog(ERROR, "cache lookup failed for conversion %u", convoid);
-       body = (Form_pg_conversion) GETSTRUCT(tuple);
-
-       /* Temporary result area should be more than big enough */
-       result = palloc(len * 4 + 1);
-
-       OidFunctionCall5(body->conproc,
-                                        Int32GetDatum(body->conforencoding),
-                                        Int32GetDatum(body->contoencoding),
-                                        CStringGetDatum(str),
-                                        CStringGetDatum(result),
-                                        Int32GetDatum(len));
-
-       ReleaseSysCache(tuple);
-
-       /*
-        * build text result structure. we cannot use textin() here, since
-        * textin assumes that input string encoding is same as database
-        * encoding.
-        */
-       len = strlen(result) + VARHDRSZ;
-       retval = palloc(len);
-       VARATT_SIZEP(retval) = len;
-       memcpy(VARDATA(retval), result, len - VARHDRSZ);
-
-       pfree(result);
-       pfree(str);
-
-       PG_RETURN_TEXT_P(retval);
-}