|
3 | 3 | *back to source text |
4 | 4 | * |
5 | 5 | * IDENTIFICATION |
6 | | - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.134 2003/02/03 21:15:44 tgl Exp $ |
| 6 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.135 2003/02/13 05:10:39 momjian Exp $ |
7 | 7 | * |
8 | 8 | * This software is copyrighted by Jan Wieck - Hamburg. |
9 | 9 | * |
@@ -546,9 +546,6 @@ pg_get_indexdef(PG_FUNCTION_ARGS) |
546 | 546 | * |
547 | 547 | * Returns the definition for the constraint, ie, everything that needs to |
548 | 548 | * appear after "ALTER TABLE ... ADD CONSTRAINT <constraintname>". |
549 | | - * |
550 | | - * XXX The present implementation only works for foreign-key constraints, but |
551 | | - * it could and should handle anything pg_constraint stores. |
552 | 549 | */ |
553 | 550 | Datum |
554 | 551 | pg_get_constraintdef(PG_FUNCTION_ARGS) |
@@ -698,10 +695,53 @@ pg_get_constraintdef(PG_FUNCTION_ARGS) |
698 | 695 |
|
699 | 696 | break; |
700 | 697 | } |
| 698 | +caseCONSTRAINT_PRIMARY: |
| 699 | +caseCONSTRAINT_UNIQUE: |
| 700 | +{ |
| 701 | +Datumval; |
| 702 | +boolisnull; |
701 | 703 |
|
702 | | -/* |
703 | | - * XXX Add more code here for other contypes |
704 | | - */ |
| 704 | +/* Start off the constraint definition */ |
| 705 | +if (conForm->contype==CONSTRAINT_PRIMARY) |
| 706 | +appendStringInfo(&buf,"PRIMARY KEY ("); |
| 707 | +else |
| 708 | +appendStringInfo(&buf,"UNIQUE ("); |
| 709 | + |
| 710 | +/* Fetch and build target column list */ |
| 711 | +val=heap_getattr(tup,Anum_pg_constraint_conkey, |
| 712 | +RelationGetDescr(conDesc),&isnull); |
| 713 | +if (isnull) |
| 714 | +elog(ERROR,"pg_get_constraintdef: Null conkey for constraint %u", |
| 715 | +constraintId); |
| 716 | + |
| 717 | +decompile_column_index_array(val,conForm->conrelid,&buf); |
| 718 | + |
| 719 | +appendStringInfo(&buf,")"); |
| 720 | + |
| 721 | +break; |
| 722 | +} |
| 723 | +caseCONSTRAINT_CHECK: |
| 724 | +{ |
| 725 | +Datumval; |
| 726 | +boolisnull; |
| 727 | + |
| 728 | +/* Start off the constraint definition */ |
| 729 | +/* The consrc for CHECK constraints always seems to be |
| 730 | + bracketed, so we don't add extra brackets here. */ |
| 731 | +appendStringInfo(&buf,"CHECK "); |
| 732 | + |
| 733 | +/* Fetch constraint source */ |
| 734 | +val=heap_getattr(tup,Anum_pg_constraint_consrc, |
| 735 | +RelationGetDescr(conDesc),&isnull); |
| 736 | +if (isnull) |
| 737 | +elog(ERROR,"pg_get_constraintdef: Null consrc for constraint %u", |
| 738 | +constraintId); |
| 739 | + |
| 740 | +/* Append the constraint source */ |
| 741 | +appendStringInfo(&buf,DatumGetCString(DirectFunctionCall1(textout,val))); |
| 742 | + |
| 743 | +break; |
| 744 | +} |
705 | 745 | default: |
706 | 746 | elog(ERROR,"pg_get_constraintdef: unsupported constraint type '%c'", |
707 | 747 | conForm->contype); |
|