@ -3,7 +3,7 @@
* back to source text
*
* IDENTIFICATION
* $ PostgreSQL : pgsql / src / backend / utils / adt / ruleutils . c , v 1.188 .4 .5 2006 / 05 / 21 19 : 57 : 39 momjian Exp $
* $ PostgreSQL : pgsql / src / backend / utils / adt / ruleutils . c , v 1.188 .4 .6 2007 / 10 / 13 15 : 56 : 08 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg .
*
@ -55,6 +55,7 @@
# include "catalog/pg_operator.h"
# include "catalog/pg_shadow.h"
# include "catalog/pg_trigger.h"
# include "commands/tablespace.h"
# include "executor/spi.h"
# include "lib/stringinfo.h"
# include "miscadmin.h"
@ -156,12 +157,13 @@ static char *pg_get_viewdef_worker(Oid viewoid, int prettyFlags);
static void decompile_column_index_array ( Datum column_index_array , Oid relId ,
StringInfo buf ) ;
static char * pg_get_ruledef_worker ( Oid ruleoid , int prettyFlags ) ;
static char * pg_get_indexdef_worker ( Oid indexrelid , int colno ,
static char * pg_get_indexdef_worker ( Oid indexrelid , int colno , bool showTblSpc ,
int prettyFlags ) ;
static char * pg_get_constraintdef_worker ( Oid constraintId , bool fullCommand ,
int prettyFlags ) ;
static char * pg_get_expr_worker ( text * expr , Oid relid , char * relname ,
int prettyFlags ) ;
static Oid get_constraint_index ( Oid constraintId ) ;
static void make_ruledef ( StringInfo buf , HeapTuple ruletup , TupleDesc rulettc ,
int prettyFlags ) ;
static void make_viewdef ( StringInfo buf , HeapTuple ruletup , TupleDesc rulettc ,
@ -593,6 +595,10 @@ pg_get_triggerdef(PG_FUNCTION_ARGS)
* In the extended version , there is a colno argument as well as pretty bool .
* if colno = = 0 , we want a complete index definition .
* if colno > 0 , we only want the Nth index key ' s variable or expression .
*
* Note that the SQL - function versions of this omit any info about the
* index tablespace ; this is intentional because pg_dump wants it that way .
* However pg_get_indexdef_string ( ) includes index tablespace if not default .
* - - - - - - - - - -
*/
Datum
@ -600,7 +606,8 @@ pg_get_indexdef(PG_FUNCTION_ARGS)
{
Oid indexrelid = PG_GETARG_OID ( 0 ) ;
PG_RETURN_TEXT_P ( string_to_text ( pg_get_indexdef_worker ( indexrelid , 0 , 0 ) ) ) ;
PG_RETURN_TEXT_P ( string_to_text ( pg_get_indexdef_worker ( indexrelid , 0 ,
false , 0 ) ) ) ;
}
Datum
@ -612,18 +619,20 @@ pg_get_indexdef_ext(PG_FUNCTION_ARGS)
int prettyFlags ;
prettyFlags = pretty ? PRETTYFLAG_PAREN | PRETTYFLAG_INDENT : 0 ;
PG_RETURN_TEXT_P ( string_to_text ( pg_get_indexdef_worker ( indexrelid , colno , prettyFlags ) ) ) ;
PG_RETURN_TEXT_P ( string_to_text ( pg_get_indexdef_worker ( indexrelid , colno ,
false , prettyFlags ) ) ) ;
}
/* Internal version that returns a palloc'd C string */
char *
pg_get_indexdef_string ( Oid indexrelid )
{
return pg_get_indexdef_worker ( indexrelid , 0 , 0 ) ;
return pg_get_indexdef_worker ( indexrelid , 0 , true , 0 ) ;
}
static char *
pg_get_indexdef_worker ( Oid indexrelid , int colno , int prettyFlags )
pg_get_indexdef_worker ( Oid indexrelid , int colno , bool showTblSpc ,
int prettyFlags )
{
HeapTuple ht_idx ;
HeapTuple ht_idxrel ;
@ -772,6 +781,19 @@ pg_get_indexdef_worker(Oid indexrelid, int colno, int prettyFlags)
{
appendStringInfoChar ( & buf , ' ) ' ) ;
/*
* If it ' s in a nondefault tablespace , say so , but only if requested
*/
if ( showTblSpc )
{
Oid tblspc ;
tblspc = get_rel_tablespace ( indexrelid ) ;
if ( OidIsValid ( tblspc ) )
appendStringInfo ( & buf , " TABLESPACE %s " ,
quote_identifier ( get_tablespace_name ( tblspc ) ) ) ;
}
/*
* If it ' s a partial index , decompile and append the predicate
*/
@ -1000,6 +1022,7 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
{
Datum val ;
bool isnull ;
Oid indexId ;
/* Start off the constraint definition */
if ( conForm - > contype = = CONSTRAINT_PRIMARY )
@ -1017,6 +1040,20 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
decompile_column_index_array ( val , conForm - > conrelid , & buf ) ;
appendStringInfo ( & buf , " ) " ) ;
indexId = get_constraint_index ( constraintId ) ;
/* XXX why do we only print this bit if fullCommand? */
if ( fullCommand & & OidIsValid ( indexId ) )
{
Oid tblspc ;
tblspc = get_rel_tablespace ( indexId ) ;
if ( OidIsValid ( tblspc ) )
appendStringInfo ( & buf , " USING INDEX TABLESPACE %s " ,
quote_identifier ( get_tablespace_name ( tblspc ) ) ) ;
}
break ;
}
case CONSTRAINT_CHECK :
@ -1330,7 +1367,69 @@ pg_get_serial_sequence(PG_FUNCTION_ARGS)
}
/* ----------
/*
* get_constraint_index
* Given the OID of a unique or primary - key constraint , return the
* OID of the underlying unique index .
*
* Return InvalidOid if the index couldn ' t be found ; this suggests the
* given OID is bogus , but we leave it to caller to decide what to do .
*/
static Oid
get_constraint_index ( Oid constraintId )
{
Oid indexId = InvalidOid ;
Relation depRel ;
ScanKeyData key [ 3 ] ;
SysScanDesc scan ;
HeapTuple tup ;
/* Search the dependency table for the dependent index */
depRel = heap_openr ( DependRelationName , AccessShareLock ) ;
ScanKeyInit ( & key [ 0 ] ,
Anum_pg_depend_refclassid ,
BTEqualStrategyNumber , F_OIDEQ ,
ObjectIdGetDatum ( get_system_catalog_relid ( ConstraintRelationName ) ) ) ;
ScanKeyInit ( & key [ 1 ] ,
Anum_pg_depend_refobjid ,
BTEqualStrategyNumber , F_OIDEQ ,
ObjectIdGetDatum ( constraintId ) ) ;
ScanKeyInit ( & key [ 2 ] ,
Anum_pg_depend_refobjsubid ,
BTEqualStrategyNumber , F_INT4EQ ,
Int32GetDatum ( 0 ) ) ;
scan = systable_beginscan ( depRel , DependReferenceIndex , true ,
SnapshotNow , 3 , key ) ;
while ( HeapTupleIsValid ( tup = systable_getnext ( scan ) ) )
{
Form_pg_depend deprec = ( Form_pg_depend ) GETSTRUCT ( tup ) ;
/*
* We assume any internal dependency of an index on the constraint
* must be what we are looking for . ( The relkind test is just
* paranoia ; there shouldn ' t be any such dependencies otherwise . )
*/
if ( deprec - > classid = = RelOid_pg_class & &
deprec - > objsubid = = 0 & &
deprec - > deptype = = DEPENDENCY_INTERNAL & &
get_rel_relkind ( deprec - > objid ) = = RELKIND_INDEX )
{
indexId = deprec - > objid ;
break ;
}
}
systable_endscan ( scan ) ;
heap_close ( depRel , AccessShareLock ) ;
return indexId ;
}
/*
* deparse_expression - General utility for deparsing expressions
*
* calls deparse_expression_pretty with all prettyPrinting disabled