Hello.

While looking into *some* tool that heavily reliant on
debug_query_string, I found that the tool can miss it.  However I
believed that it is always set when post_parse_analyze_hook is
called, it is not while processing DESCRIBE message of extended
protocol. I believe that the assumption is not so ridiculous.

The call stack is as the follows.

parse_analze()
pg_analyze_and_rewrite()
RevalidateCachedQuery()
CachedPlanGetTargetList()
exec_describe_statement_message()
PostgreMain() (message 'DS')

It is set for other kinds of message, (parse, bind, execute). I
think fastpath, close, flush and sync don't need that. If it is
reasonable to assume that we can see debug_query_string in the
DESCRIBE path, the attached patch would work.

The exec_describe_statement_message() case seems rather simple
but the exec_describe_portal_message() case is troublesome.

But, in the first place, the biggest problem is the fact that I
myself haven't been able to run the path...

Any suggestions, thoughts, opinions are welcome.

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center
*** a/src/backend/tcop/postgres.c
--- b/src/backend/tcop/postgres.c
***************
*** 2399,2407 **** exec_describe_statement_message(const char *stmt_name)
--- 2399,2414 ----
  	{
  		List	   *tlist;
  
+ 		/*
+ 		 * Report query to various monitoring facilities.
+ 		 */
+ 		debug_query_string = psrc->query_string;
+ 
  		/* Get the plan's primary targetlist */
  		tlist = CachedPlanGetTargetList(psrc, NULL);
  
+ 		debug_query_string = NULL;
+ 
  		SendRowDescriptionMessage(&row_description_buf,
  								  psrc->resultDesc,
  								  tlist,
*** a/src/backend/utils/cache/plancache.c
--- b/src/backend/utils/cache/plancache.c
***************
*** 1429,1434 **** CachedPlanGetTargetList(CachedPlanSource *plansource,
--- 1429,1436 ----
  						QueryEnvironment *queryEnv)
  {
  	Query	   *pstmt;
+ 	bool		reset_debug_query_string = false;
+ 	List	   *ret;
  
  	/* Assert caller is doing things in a sane order */
  	Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC);
***************
*** 1441,1453 **** CachedPlanGetTargetList(CachedPlanSource *plansource,
  	if (plansource->resultDesc == NULL)
  		return NIL;
  
  	/* Make sure the querytree list is valid and we have parse-time locks */
  	RevalidateCachedQuery(plansource, queryEnv);
  
  	/* Get the primary statement and find out what it returns */
  	pstmt = QueryListGetPrimaryStmt(plansource->query_list);
  
! 	return FetchStatementTargetList((Node *) pstmt);
  }
  
  /*
--- 1443,1470 ----
  	if (plansource->resultDesc == NULL)
  		return NIL;
  
+ 	
+ 	/*
+ 	 * Report query to various monitoring facilities if we haven't done.
+ 	 */
+ 	if (!debug_query_string && plansource->query_string)
+ 	{
+ 		debug_query_string = plansource->query_string;
+ 		reset_debug_query_string = true;
+ 	}
+ 
  	/* Make sure the querytree list is valid and we have parse-time locks */
  	RevalidateCachedQuery(plansource, queryEnv);
  
  	/* Get the primary statement and find out what it returns */
  	pstmt = QueryListGetPrimaryStmt(plansource->query_list);
  
! 	ret = FetchStatementTargetList((Node *) pstmt);
! 
! 	if (reset_debug_query_string)
! 		debug_query_string = NULL;
! 
! 	return ret;
  }
  
  /*

Reply via email to