From d394d06d7ab2e31969735479885cbfd544eb309a Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 26 Aug 1998 16:43:54 +0000
Subject: [PATCH] Fix atttypmod alignment again, and re-enable ecpg.

---
 src/backend/commands/defind.c              | 40 +++++++++++-----------
 src/backend/parser/gram.c                  |  2 +-
 src/include/catalog/pg_attribute.h         |  4 +--
 src/include/catalog/pg_attribute_check.sql | 17 +++++++++
 src/interfaces/Makefile                    |  4 +--
 src/interfaces/ecpg/preproc/preproc.y      |  2 +-
 6 files changed, 43 insertions(+), 26 deletions(-)
 create mode 100644 src/include/catalog/pg_attribute_check.sql

diff --git a/src/backend/commands/defind.c b/src/backend/commands/defind.c
index ee4678372e..7df18c0f69 100644
--- a/src/backend/commands/defind.c
+++ b/src/backend/commands/defind.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.23 1998/08/26 05:22:36 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.24 1998/08/26 16:43:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -468,7 +468,7 @@ NormIndexAttrs(List *attList,	/* list of IndexElem's */
 			   Oid relId)
 {
 	List	   *rest;
-	HeapTuple	tuple;
+	HeapTuple	atttuple, tuple;
 
 	/*
 	 * process attributeList
@@ -484,20 +484,34 @@ NormIndexAttrs(List *attList,	/* list of IndexElem's */
 		if (attribute->name == NULL)
 			elog(ERROR, "missing attribute for define index");
 
-		tuple = SearchSysCacheTuple(ATTNAME,
+		atttuple = SearchSysCacheTupleCopy(ATTNAME,
 									ObjectIdGetDatum(relId),
 									PointerGetDatum(attribute->name),
 									0, 0);
-		if (!HeapTupleIsValid(tuple))
+		if (!HeapTupleIsValid(atttuple))
 		{
 			elog(ERROR,
 				 "DefineIndex: attribute \"%s\" not found",
 				 attribute->name);
 		}
 
-		attform = (AttributeTupleForm) GETSTRUCT(tuple);
+		attform = (AttributeTupleForm) GETSTRUCT(atttuple);
 		*attNumP++ = attform->attnum;
 
+		/* we want the type so we can set the proper alignment, etc. */
+		if (attribute->typename == NULL)
+		{
+			tuple = SearchSysCacheTuple(TYPOID,
+									  ObjectIdGetDatum(attform->atttypid),
+									  0, 0, 0);
+			if (!HeapTupleIsValid(tuple))
+				elog(ERROR, "create index: type for attribute '%s' undefined",
+					 attribute->name);
+			/* we just set the type name because that is all we need */
+			attribute->typename = makeNode(TypeName);
+			attribute->typename->name = nameout(&((TypeTupleForm) GETSTRUCT(tuple))->typname);
+		}
+
 		if (attribute->class == NULL)
 		{
 			/* no operator class specified, so find the default */
@@ -520,21 +534,7 @@ NormIndexAttrs(List *attList,	/* list of IndexElem's */
 				 attribute->class);
 		}
 		*classOidP++ = tuple->t_oid;
-		/* we want the type so we can set the proper alignment, etc. */
-		if (attribute->typename == NULL)
-		{
-			Oid typoid = ((Form_pg_opclass) GETSTRUCT(tuple))->opcdeftype;
-			
-			tuple = SearchSysCacheTuple(TYPOID,
-									  ObjectIdGetDatum(typoid),
-									  0, 0, 0);
-			if (!HeapTupleIsValid(tuple))
-				elog(ERROR, "create index: type for class '%s' undefined",
-					 attribute->class);
-			/* we just set the name because that is all we need */
-			attribute->typename = makeNode(TypeName);
-			attribute->typename->name = nameout(&((TypeTupleForm) GETSTRUCT(tuple))->typname);
-		}
+		pfree(atttuple);
 	}
 }
 
diff --git a/src/backend/parser/gram.c b/src/backend/parser/gram.c
index af47e7be0e..5206df9637 100644
--- a/src/backend/parser/gram.c
+++ b/src/backend/parser/gram.c
@@ -221,7 +221,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.30 1998/08/26 05:22:43 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.31 1998/08/26 16:43:43 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index d908c54dcc..0e88c86904 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_attribute.h,v 1.37 1998/08/26 05:51:24 momjian Exp $
+ * $Id: pg_attribute.h,v 1.38 1998/08/26 16:43:48 momjian Exp $
  *
  * NOTES
  *	  the genbki.sh script reads this file and generates .bki
@@ -339,7 +339,7 @@ DATA(insert OID = 0 ( 1249 attlen			21 0  2   5 0 -1 -1 t f s f f));
 DATA(insert OID = 0 ( 1249 attnum			21 0  2   6 0 -1 -1 t f s f f));
 DATA(insert OID = 0 ( 1249 attnelems		23 0  4   7 0 -1 -1 t f i f f));
 DATA(insert OID = 0 ( 1249 attcacheoff		23 0  4   8 0 -1 -1 t f i f f));
-DATA(insert OID = 0 ( 1249 atttypmod		21 0  4   9 0 -1 -1 t f s f f));
+DATA(insert OID = 0 ( 1249 atttypmod		23 0  4   9 0 -1 -1 t f i f f));
 DATA(insert OID = 0 ( 1249 attbyval			16 0  1  10 0 -1 -1 t f c f f));
 DATA(insert OID = 0 ( 1249 attisset			16 0  1  11 0 -1 -1 t f c f f));
 DATA(insert OID = 0 ( 1249 attalign			18 0  1  12 0 -1 -1 t f c f f));
diff --git a/src/include/catalog/pg_attribute_check.sql b/src/include/catalog/pg_attribute_check.sql
new file mode 100644
index 0000000000..20264fb41a
--- /dev/null
+++ b/src/include/catalog/pg_attribute_check.sql
@@ -0,0 +1,17 @@
+-- This makes sure the pg_attribute columns match the type's columns
+-- bjm 1998/08/26
+
+-- check lengths
+SELECT	pg_attribute.oid, relname, attname
+FROM	pg_class, pg_attribute, pg_type
+WHERE	pg_class.oid = attrelid AND
+	atttypid = pg_type.oid AND
+	attlen != typlen;
+
+-- check alignment
+SELECT	pg_attribute.oid, relname, attname
+FROM	pg_class, pg_attribute, pg_type
+WHERE	pg_class.oid = attrelid AND
+	atttypid = pg_type.oid AND
+	attalign != typalign;
+
diff --git a/src/interfaces/Makefile b/src/interfaces/Makefile
index 6ff3ac386e..37e286c2d2 100644
--- a/src/interfaces/Makefile
+++ b/src/interfaces/Makefile
@@ -7,7 +7,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/interfaces/Makefile,v 1.14 1998/08/26 05:22:58 momjian Exp $
+#    $Header: /cvsroot/pgsql/src/interfaces/Makefile,v 1.15 1998/08/26 16:43:51 momjian Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -23,7 +23,7 @@ endif
 
 .DEFAULT all install clean dep depend distclean: $(perl-makefile-dep)
 	$(MAKE) -C libpq $@
-#	$(MAKE) -C ecpg $@
+	$(MAKE) -C ecpg $@
 ifeq ($(HAVE_Cplusplus), true)
 	$(MAKE) -C libpq++ $@
 else
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index cc8528e435..fec7232375 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -641,7 +641,7 @@ output_statement(char * stmt, int mode)
 %type  <str> 	join_using where_clause relation_expr row_op sub_type
 %type  <str>	opt_column_list insert_rest InsertStmt OptimizableStmt
 %type  <str>    columnList DeleteStmt LockStmt UpdateStmt CursorStmt
-%type  <str>    NotifyStmt columnElem copy_dirn SubUnion c_expr
+%type  <str>    NotifyStmt columnElem copy_dirn SubUnion c_expr UnlistenStmt
 %type  <str>    copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
 %type  <str>    opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name
 %type  <str>    ClosePortalStmt DestroyStmt VacuumStmt opt_verbose