From e9c013f4bddd953df03be74177a37016d1e22b96 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Mon, 22 Jul 2002 20:23:19 +0000
Subject: [PATCH] Add unique index on pg_cast.oid, and document pg_cast table.

---
 doc/src/sgml/catalogs.sgml          | 66 ++++++++++++++++++++++++++++-
 src/backend/catalog/indexing.c      |  4 +-
 src/backend/commands/functioncmds.c | 25 ++++++-----
 src/include/catalog/indexing.h      |  6 ++-
 4 files changed, 86 insertions(+), 15 deletions(-)

diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index 602680aaacb..ccb316e3c4e 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -1,6 +1,6 @@
 <!--
  Documentation of the system catalogs, directed toward PostgreSQL developers
- $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.45 2002/07/12 18:43:12 tgl Exp $
+ $Header: /cvsroot/pgsql/doc/src/sgml/catalogs.sgml,v 2.46 2002/07/22 20:23:19 petere Exp $
  -->
 
 <chapter id="catalogs">
@@ -66,6 +66,11 @@
       <entry>table columns (<quote>attributes</quote>, <quote>fields</quote>)</entry>
      </row>
 
+     <row>
+      <entry>pg_cast</entry>
+      <entry>casts (data type conversions)</entry>
+     </row>
+
      <row>
       <entry>pg_class</entry>
       <entry>tables, indexes, sequences (<quote>relations</quote>)</entry>
@@ -519,6 +524,65 @@
  </sect1>
 
 
+ <sect1 id="catalog-pg-cast">
+  <title>pg_cast</title>
+
+  <para>
+   <structname>pg_cast</structname> stores data type conversion paths
+   defined with <command>CREATE CAST</command> plus the built-in
+   conversions.
+  </para>
+
+  <table>
+   <title>pg_cast Columns</title>
+
+   <tgroup cols=4>
+    <thead>
+     <row>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>References</entry>
+      <entry>Description</entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry>castsource</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>OID of the source data type</entry>
+     </row>
+
+     <row>
+      <entry>casttarget</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_type.oid</entry>
+      <entry>OID of the target data type</entry>
+     </row>
+
+     <row>
+      <entry>castfunc</entry>
+      <entry><type>oid</type></entry>
+      <entry>pg_proc.oid</entry>
+      <entry>
+       The OID of the function to use to perform this cast.  A 0 is
+       stored if the data types are binary compatible (that is, no
+       function is needed to perform the cast).
+      </entry>
+     </row>
+
+     <row>
+      <entry>castimplicit</entry>
+      <entry><type>bool</type></entry>
+      <entry></entry>
+      <entry>Indication whether this cast can be invoked implicitly</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+ </sect1>
+
  <sect1 id="catalog-pg-class">
   <title>pg_class</title>
 
diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c
index 80e3a15cf57..928949d4343 100644
--- a/src/backend/catalog/indexing.c
+++ b/src/backend/catalog/indexing.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.98 2002/07/18 23:11:27 petere Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.99 2002/07/22 20:23:19 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -44,7 +44,7 @@ char	   *Name_pg_attr_indices[Num_pg_attr_indices] =
 char	   *Name_pg_attrdef_indices[Num_pg_attrdef_indices] =
 {AttrDefaultIndex, AttrDefaultOidIndex};
 char	   *Name_pg_cast_indices[Num_pg_cast_indices] =
-{CastSourceTargetIndex};
+{CastOidIndex, CastSourceTargetIndex};
 char	   *Name_pg_class_indices[Num_pg_class_indices] =
 {ClassNameNspIndex, ClassOidIndex};
 char	   *Name_pg_constraint_indices[Num_pg_constraint_indices] =
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 8717749b563..a445b7d0e7b 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.11 2002/07/20 05:37:45 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.12 2002/07/22 20:23:19 petere Exp $
  *
  * DESCRIPTION
  *	  These routines take the parse tree and pick out the
@@ -31,6 +31,7 @@
  */
 #include "postgres.h"
 
+#include "access/genam.h"
 #include "access/heapam.h"
 #include "catalog/catname.h"
 #include "catalog/dependency.h"
@@ -693,7 +694,7 @@ CreateCast(CreateCastStmt *stmt)
 		if (procstruct->proisagg)
 			elog(ERROR, "cast function must not be an aggregate function");
 		if (procstruct->proretset)
-			elog(ERROR, "cast function must be not return a set");
+			elog(ERROR, "cast function must not return a set");
 
 		ReleaseSysCache(tuple);
 	}
@@ -727,7 +728,7 @@ CreateCast(CreateCastStmt *stmt)
 		CatalogCloseIndices(Num_pg_cast_indices, idescs);
 	}
 
-	myself.classId = get_system_catalog_relid(CastRelationName);
+	myself.classId = RelationGetRelid(relation);
 	myself.objectId = HeapTupleGetOid(tuple);
 	myself.objectSubId = 0;
 
@@ -819,21 +820,25 @@ DropCast(DropCastStmt *stmt)
 void
 DropCastById(Oid castOid)
 {
-	Relation	relation;
+	Relation	relation,
+				index;
 	ScanKeyData scankey;
-	HeapScanDesc scan;
+	IndexScanDesc scan;
 	HeapTuple	tuple;
 
 	relation = heap_openr(CastRelationName, RowExclusiveLock);
+	index = index_openr(CastOidIndex);
+
 	ScanKeyEntryInitialize(&scankey, 0x0,
-						   ObjectIdAttributeNumber, F_OIDEQ,
-						   ObjectIdGetDatum(castOid));
-	scan = heap_beginscan(relation, SnapshotNow, 1, &scankey);
-	tuple = heap_getnext(scan, ForwardScanDirection);
+						   1, F_OIDEQ, ObjectIdGetDatum(castOid));
+	scan = index_beginscan(relation, index, SnapshotNow, 1, &scankey);
+	tuple = index_getnext(scan, ForwardScanDirection);
 	if (HeapTupleIsValid(tuple))
 		simple_heap_delete(relation, &tuple->t_self);
 	else
 		elog(ERROR, "could not find tuple for cast %u", castOid);
-	heap_endscan(scan);
+	index_endscan(scan);
+
+	index_close(index);
 	heap_close(relation, RowExclusiveLock);
 }
diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h
index 777a4031dd7..db14ae6bd68 100644
--- a/src/include/catalog/indexing.h
+++ b/src/include/catalog/indexing.h
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: indexing.h,v 1.71 2002/07/18 23:11:30 petere Exp $
+ * $Id: indexing.h,v 1.72 2002/07/22 20:23:19 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -26,7 +26,7 @@
 #define Num_pg_amproc_indices		1
 #define Num_pg_attr_indices			2
 #define Num_pg_attrdef_indices		2
-#define Num_pg_cast_indices			1
+#define Num_pg_cast_indices			2
 #define Num_pg_class_indices		2
 #define Num_pg_constraint_indices	3
 #define Num_pg_conversion_indices	3
@@ -61,6 +61,7 @@
 #define AttrDefaultOidIndex			"pg_attrdef_oid_index"
 #define AttributeRelidNameIndex		"pg_attribute_relid_attnam_index"
 #define AttributeRelidNumIndex		"pg_attribute_relid_attnum_index"
+#define CastOidIndex				"pg_cast_oid_index"
 #define CastSourceTargetIndex		"pg_cast_source_target_index"
 #define ClassNameNspIndex			"pg_class_relname_nsp_index"
 #define ClassOidIndex				"pg_class_oid_index"
@@ -169,6 +170,7 @@ DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index on pg_attrdef using btree(ad
 DECLARE_UNIQUE_INDEX(pg_attrdef_oid_index on pg_attrdef using btree(oid oid_ops));
 DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index on pg_attribute using btree(attrelid oid_ops, attname name_ops));
 DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnum_index on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_cast_oid_index on pg_cast using btree(oid oid_ops));
 DECLARE_UNIQUE_INDEX(pg_cast_source_target_index on pg_cast using btree(castsource oid_ops, casttarget oid_ops));
 DECLARE_UNIQUE_INDEX(pg_class_oid_index on pg_class using btree(oid oid_ops));
 DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index on pg_class using btree(relname name_ops, relnamespace oid_ops));
-- 
GitLab