}
}
+/*
+ * Zap query context info in sent messages to indicate that the query context
+ * has been already removed.
+ */
+void
+pool_zap_query_context_in_sent_messages(POOL_QUERY_CONTEXT *query_context)
+{
+ int i;
+ POOL_SENT_MESSAGE_LIST *msglist;
+
+ msglist = &pool_get_session_context(false)->message_list;
+
+ for (i = 0; i < msglist->size; i++)
+ {
+ elog(LOG, "checking zapping sent message: %p query_context: %p",
+ &msglist->sent_messages[i], msglist->sent_messages[i]->query_context);
+ if (msglist->sent_messages[i]->query_context == query_context)
+ {
+ msglist->sent_messages[i]->query_context = NULL;
+ elog(LOG, "Zap sent message: %p", &msglist->sent_messages[i]);
+ }
+ }
+}
+
static void dump_sent_message(char *caller, POOL_SENT_MESSAGE *m)
{
ereport(DEBUG1,
}
/*
- * Get a sent message
+ * Find a sent message by kind and name.
*/
POOL_SENT_MESSAGE *pool_get_sent_message(char kind, const char *name, POOL_SENT_MESSAGE_STATE state)
{
return NULL;
}
+/*
+ * Find a sent message by query context.
+ */
+POOL_SENT_MESSAGE *
+pool_get_sent_message_by_query_context(POOL_QUERY_CONTEXT * query_context)
+{
+ int i;
+ POOL_SENT_MESSAGE_LIST *msglist;
+
+ msglist = &pool_get_session_context(false)->message_list;
+
+ if (query_context == NULL)
+ return NULL;
+
+ for (i = 0; i < msglist->size; i++)
+ {
+ if (msglist->sent_messages[i]->query_context == query_context)
+ return msglist->sent_messages[i];
+ }
+
+ return NULL;
+}
+
/*
* Set message state to POOL_SENT_MESSAGE_STATE to POOL_SENT_MESSAGE_CLOSED.
*/
extern void pool_sent_message_destroy(POOL_SENT_MESSAGE *message);
extern POOL_SENT_MESSAGE *pool_get_sent_message(char kind, const char *name, POOL_SENT_MESSAGE_STATE state);
extern void pool_set_sent_message_state(POOL_SENT_MESSAGE *message);
+extern void pool_zap_query_context_in_sent_messages(POOL_QUERY_CONTEXT *query_context);
+extern POOL_SENT_MESSAGE * pool_get_sent_message_by_query_context(POOL_QUERY_CONTEXT * query_context);
extern void pool_unset_writing_transaction(void);
extern void pool_set_writing_transaction(void);
extern bool pool_is_writing_transaction(void);
pool_at_command_success(frontend, backend);
pool_unset_query_in_progress();
pool_pending_message_reset_previous_message();
+
+ if (session_context->query_context == NULL)
+ {
+ elog(WARNING, "At command complete there's no query context");
+ }
+ else
+ {
+ /*
+ * Destroy query context if it is not referenced from sent
+ * messages and pending messages except bound to named statements
+ * or portals. Named statements and portals should remain until
+ * they are explicitly closed.
+ */
+ if (can_query_context_destroy(session_context->query_context))
+
+ {
+ POOL_SENT_MESSAGE * msg = pool_get_sent_message_by_query_context(session_context->query_context);
+
+ if (!msg || (msg && *msg->name == '\0'))
+ {
+ pool_zap_query_context_in_sent_messages(session_context->query_context);
+ pool_query_context_destroy(session_context->query_context);
+ }
+ }
+ }
}
return POOL_CONTINUE;