*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
Oid relId)
{
List *rest;
- HeapTuple tuple;
+ HeapTuple atttuple, tuple;
/*
* process attributeList
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 */
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);
}
}
*
* 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
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));
--- /dev/null
+-- 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;
+
%type join_using where_clause relation_expr row_op sub_type
%type opt_column_list insert_rest InsertStmt OptimizableStmt
%type columnList DeleteStmt LockStmt UpdateStmt CursorStmt
-%type NotifyStmt columnElem copy_dirn SubUnion c_expr
+%type NotifyStmt columnElem copy_dirn SubUnion c_expr UnlistenStmt
%type copy_delimiter ListenStmt CopyStmt copy_file_name opt_binary
%type opt_with_copy FetchStmt opt_direction fetch_how_many opt_portal_name
%type ClosePortalStmt DestroyStmt VacuumStmt opt_verbose