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;
}
/*