*                             back to source text
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.134 2003/02/03 21:15:44 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.135 2003/02/13 05:10:39 momjian Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
  *
  * Returns the definition for the constraint, ie, everything that needs to
  * appear after "ALTER TABLE ... ADD CONSTRAINT <constraintname>".
- *
- * XXX The present implementation only works for foreign-key constraints, but
- * it could and should handle anything pg_constraint stores.
  */
 Datum
 pg_get_constraintdef(PG_FUNCTION_ARGS)
 
                                break;
                        }
+               case CONSTRAINT_PRIMARY:
+               case CONSTRAINT_UNIQUE:
+                       {
+                               Datum           val;
+                               bool            isnull;
 
-                       /*
-                        * XXX Add more code here for other contypes
-                        */
+                               /* Start off the constraint definition */
+                               if (conForm->contype == CONSTRAINT_PRIMARY)
+                                       appendStringInfo(&buf, "PRIMARY KEY (");
+                               else
+                                       appendStringInfo(&buf, "UNIQUE (");
+
+                               /* Fetch and build target column list */
+                               val = heap_getattr(tup, Anum_pg_constraint_conkey,
+                                                                  RelationGetDescr(conDesc), &isnull);
+                               if (isnull)
+                                       elog(ERROR, "pg_get_constraintdef: Null conkey for constraint %u",
+                                                constraintId);
+
+                               decompile_column_index_array(val, conForm->conrelid, &buf);
+
+                               appendStringInfo(&buf, ")");
+
+                               break;
+                       }
+               case CONSTRAINT_CHECK:
+                       {
+                               Datum           val;
+                               bool            isnull;
+
+                               /* Start off the constraint definition */
+                               /* The consrc for CHECK constraints always seems to be
+                                  bracketed, so we don't add extra brackets here. */
+                               appendStringInfo(&buf, "CHECK ");
+
+                               /* Fetch constraint source */
+                               val = heap_getattr(tup, Anum_pg_constraint_consrc,
+                                                                  RelationGetDescr(conDesc), &isnull);
+                               if (isnull)
+                                       elog(ERROR, "pg_get_constraintdef: Null consrc for constraint %u",
+                                                constraintId);
+
+                               /* Append the constraint source */
+                               appendStringInfo(&buf, DatumGetCString(DirectFunctionCall1(textout, val))); 
+
+                               break;
+                       }
                default:
                        elog(ERROR, "pg_get_constraintdef: unsupported constraint type '%c'",
                                 conForm->contype);