@ -34,6 +34,7 @@
# include "catalog/pg_operator.h"
# include "catalog/pg_opfamily.h"
# include "catalog/pg_proc.h"
# include "catalog/pg_statistic_ext.h"
# include "catalog/pg_ts_config.h"
# include "catalog/pg_ts_dict.h"
# include "catalog/pg_ts_parser.h"
@ -2141,6 +2142,72 @@ get_statistics_oid(List *names, bool missing_ok)
return stats_oid ;
}
/*
* StatisticsObjIsVisible
* Determine whether a statistics object ( identified by OID ) is visible in
* the current search path . Visible means " would be found by searching
* for the unqualified statistics object name " .
*/
bool
StatisticsObjIsVisible ( Oid relid )
{
HeapTuple stxtup ;
Form_pg_statistic_ext stxform ;
Oid stxnamespace ;
bool visible ;
stxtup = SearchSysCache1 ( STATEXTOID , ObjectIdGetDatum ( relid ) ) ;
if ( ! HeapTupleIsValid ( stxtup ) )
elog ( ERROR , " cache lookup failed for statistics object %u " , relid ) ;
stxform = ( Form_pg_statistic_ext ) GETSTRUCT ( stxtup ) ;
recomputeNamespacePath ( ) ;
/*
* Quick check : if it ain ' t in the path at all , it ain ' t visible . Items in
* the system namespace are surely in the path and so we needn ' t even do
* list_member_oid ( ) for them .
*/
stxnamespace = stxform - > stxnamespace ;
if ( stxnamespace ! = PG_CATALOG_NAMESPACE & &
! list_member_oid ( activeSearchPath , stxnamespace ) )
visible = false ;
else
{
/*
* If it is in the path , it might still not be visible ; it could be
* hidden by another statistics object of the same name earlier in the
* path . So we must do a slow check for conflicting objects .
*/
char * stxname = NameStr ( stxform - > stxname ) ;
ListCell * l ;
visible = false ;
foreach ( l , activeSearchPath )
{
Oid namespaceId = lfirst_oid ( l ) ;
if ( namespaceId = = stxnamespace )
{
/* Found it first in path */
visible = true ;
break ;
}
if ( SearchSysCacheExists2 ( STATEXTNAMENSP ,
PointerGetDatum ( stxname ) ,
ObjectIdGetDatum ( namespaceId ) ) )
{
/* Found something else first in path */
break ;
}
}
}
ReleaseSysCache ( stxtup ) ;
return visible ;
}
/*
* get_ts_parser_oid - find a TS parser by possibly qualified name
*
@ -4235,6 +4302,17 @@ pg_conversion_is_visible(PG_FUNCTION_ARGS)
PG_RETURN_BOOL ( ConversionIsVisible ( oid ) ) ;
}
Datum
pg_statistic_ext_is_visible ( PG_FUNCTION_ARGS )
{
Oid oid = PG_GETARG_OID ( 0 ) ;
if ( ! SearchSysCacheExists1 ( STATEXTOID , ObjectIdGetDatum ( oid ) ) )
PG_RETURN_NULL ( ) ;
PG_RETURN_BOOL ( StatisticsObjIsVisible ( oid ) ) ;
}
Datum
pg_ts_parser_is_visible ( PG_FUNCTION_ARGS )
{