@ -352,8 +352,7 @@ static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags,
bool attrsOnly , bool missing_ok ) ;
bool attrsOnly , bool missing_ok ) ;
static char * pg_get_constraintdef_worker ( Oid constraintId , bool fullCommand ,
static char * pg_get_constraintdef_worker ( Oid constraintId , bool fullCommand ,
int prettyFlags , bool missing_ok ) ;
int prettyFlags , bool missing_ok ) ;
static text * pg_get_expr_worker ( text * expr , Oid relid , const char * relname ,
static text * pg_get_expr_worker ( text * expr , Oid relid , int prettyFlags ) ;
int prettyFlags ) ;
static int print_function_arguments ( StringInfo buf , HeapTuple proctup ,
static int print_function_arguments ( StringInfo buf , HeapTuple proctup ,
bool print_table_args , bool print_defaults ) ;
bool print_table_args , bool print_defaults ) ;
static void print_function_rettype ( StringInfo buf , HeapTuple proctup ) ;
static void print_function_rettype ( StringInfo buf , HeapTuple proctup ) ;
@ -2615,6 +2614,11 @@ decompile_column_index_array(Datum column_index_array, Oid relId,
* partial indexes , column default expressions , etc . We also support
* partial indexes , column default expressions , etc . We also support
* Var - free expressions , for which the OID can be InvalidOid .
* Var - free expressions , for which the OID can be InvalidOid .
*
*
* If the OID is nonzero but not actually valid , don ' t throw an error ,
* just return NULL . This is a bit questionable , but it ' s what we ' ve
* done historically , and it can help avoid unwanted failures when
* examining catalog entries for just - deleted relations .
*
* We expect this function to work , or throw a reasonably clean error ,
* We expect this function to work , or throw a reasonably clean error ,
* for any node tree that can appear in a catalog pg_node_tree column .
* for any node tree that can appear in a catalog pg_node_tree column .
* Query trees , such as those appearing in pg_rewrite . ev_action , are
* Query trees , such as those appearing in pg_rewrite . ev_action , are
@ -2627,29 +2631,16 @@ pg_get_expr(PG_FUNCTION_ARGS)
{
{
text * expr = PG_GETARG_TEXT_PP ( 0 ) ;
text * expr = PG_GETARG_TEXT_PP ( 0 ) ;
Oid relid = PG_GETARG_OID ( 1 ) ;
Oid relid = PG_GETARG_OID ( 1 ) ;
text * result ;
int prettyFlags ;
int prettyFlags ;
char * relname ;
prettyFlags = PRETTYFLAG_INDENT ;
prettyFlags = PRETTYFLAG_INDENT ;
if ( OidIsValid ( relid ) )
result = pg_get_expr_worker ( expr , relid , prettyFlags ) ;
{
if ( result )
/* Get the name for the relation */
PG_RETURN_TEXT_P ( result ) ;
relname = get_rel_name ( relid ) ;
/*
* If the OID isn ' t actually valid , don ' t throw an error , just return
* NULL . This is a bit questionable , but it ' s what we ' ve done
* historically , and it can help avoid unwanted failures when
* examining catalog entries for just - deleted relations .
*/
if ( relname = = NULL )
PG_RETURN_NULL ( ) ;
}
else
else
relname = NULL ;
PG_RETURN_NULL ( ) ;
PG_RETURN_TEXT_P ( pg_get_expr_worker ( expr , relid , relname , prettyFlags ) ) ;
}
}
Datum
Datum
@ -2658,33 +2649,27 @@ pg_get_expr_ext(PG_FUNCTION_ARGS)
text * expr = PG_GETARG_TEXT_PP ( 0 ) ;
text * expr = PG_GETARG_TEXT_PP ( 0 ) ;
Oid relid = PG_GETARG_OID ( 1 ) ;
Oid relid = PG_GETARG_OID ( 1 ) ;
bool pretty = PG_GETARG_BOOL ( 2 ) ;
bool pretty = PG_GETARG_BOOL ( 2 ) ;
text * result ;
int prettyFlags ;
int prettyFlags ;
char * relname ;
prettyFlags = GET_PRETTY_FLAGS ( pretty ) ;
prettyFlags = GET_PRETTY_FLAGS ( pretty ) ;
if ( OidIsValid ( relid ) )
result = pg_get_expr_worker ( expr , relid , prettyFlags ) ;
{
if ( result )
/* Get the name for the relation */
PG_RETURN_TEXT_P ( result ) ;
relname = get_rel_name ( relid ) ;
/* See notes above */
if ( relname = = NULL )
PG_RETURN_NULL ( ) ;
}
else
else
relname = NULL ;
PG_RETURN_NULL ( ) ;
PG_RETURN_TEXT_P ( pg_get_expr_worker ( expr , relid , relname , prettyFlags ) ) ;
}
}
static text *
static text *
pg_get_expr_worker ( text * expr , Oid relid , const char * relname , int prettyFlags )
pg_get_expr_worker ( text * expr , Oid relid , int prettyFlags )
{
{
Node * node ;
Node * node ;
Node * tst ;
Node * tst ;
Relids relids ;
Relids relids ;
List * context ;
List * context ;
char * exprstr ;
char * exprstr ;
Relation rel = NULL ;
char * str ;
char * str ;
/* Convert input pg_node_tree (really TEXT) object to C string */
/* Convert input pg_node_tree (really TEXT) object to C string */
@ -2729,9 +2714,19 @@ pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags)
errmsg ( " expression contains variables " ) ) ) ;
errmsg ( " expression contains variables " ) ) ) ;
}
}
/* Prepare deparse context if needed */
/*
* Prepare deparse context if needed . If we are deparsing with a relid ,
* we need to transiently open and lock the rel , to make sure it won ' t go
* away underneath us . ( set_relation_column_names would lock it anyway ,
* so this isn ' t really introducing any new behavior . )
*/
if ( OidIsValid ( relid ) )
if ( OidIsValid ( relid ) )
context = deparse_context_for ( relname , relid ) ;
{
rel = try_relation_open ( relid , AccessShareLock ) ;
if ( rel = = NULL )
return NULL ;
context = deparse_context_for ( RelationGetRelationName ( rel ) , relid ) ;
}
else
else
context = NIL ;
context = NIL ;
@ -2739,6 +2734,9 @@ pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags)
str = deparse_expression_pretty ( node , context , false , false ,
str = deparse_expression_pretty ( node , context , false , false ,
prettyFlags , 0 ) ;
prettyFlags , 0 ) ;
if ( rel ! = NULL )
relation_close ( rel , AccessShareLock ) ;
return string_to_text ( str ) ;
return string_to_text ( str ) ;
}
}