for (i=0;i<NUM_BACKENDS;i++)
{
+#ifdef NOT_USED
if (!VALID_BACKEND(i) || IS_MASTER_NODE_ID(i) || use_sync_map == POOL_SYNC_MAP_EMPTY)
{
continue;
{
continue;
}
+#endif
+ if (!VALID_BACKEND(i) || IS_MASTER_NODE_ID(i))
+ {
+ continue;
+ }
pool_read(CONNECTION(cp, i), &length, sizeof(length));
/* Initialize pending message list */
pool_pending_messages_init();
+ /* Initialize previous pending message */
+ pool_pending_message_reset_previous_message();
+
/* Initialize preferred master node id */
pool_reset_preferred_master_node_id();
}
return msg;
}
+/*
+ * Reset previous message.
+ */
+void pool_pending_message_reset_previous_message(void)
+{
+ if (!session_context)
+ {
+ ereport(ERROR,
+ (errmsg("pool_pending_message_reset_previous_message: session context is not initialized")));
+ return;
+ }
+ session_context->previous_message = NULL;
+}
+
+/*
+ * Set previous message.
+ */
+void pool_pending_message_set_previous_message(POOL_PENDING_MESSAGE *message)
+{
+ if (!session_context)
+ {
+ ereport(ERROR,
+ (errmsg("pool_pending_message_set_previous_message: session context is not initialized")));
+ return;
+ }
+ session_context->previous_message = message;
+}
+
+/*
+ * Get previous message.
+ */
+POOL_PENDING_MESSAGE *pool_pending_message_get_previous_message(void)
+{
+ if (!session_context)
+ {
+ ereport(ERROR,
+ (errmsg("pool_pending_message_get_previous_message: session context is not initialized")));
+ return;
+ }
+ return session_context->previous_message;
+}
+
/*
* Dump whole pending message list
*/
bool is_pending_response;
/*
- * Parse/Bind/Close message queue.
+ * Parse/Bind/Decribe/Execute/Close message queue.
*/
List *pending_messages;
+ /*
+ * The last pending message. Reset at Ready for query.
+ */
+ POOL_PENDING_MESSAGE *previous_message;
+
/* Protocol major version number */
int major;
/* Protocol minor version number */
extern POOL_PENDING_MESSAGE *pool_pending_message_remove(POOL_MESSAGE_TYPE type);
extern char pool_get_close_message_spec(POOL_PENDING_MESSAGE *msg);
extern char *pool_get_close_message_name(POOL_PENDING_MESSAGE *msg);
+extern void pool_pending_message_reset_previous_message(void);
+extern void pool_pending_message_set_previous_message(POOL_PENDING_MESSAGE *message);
+extern POOL_PENDING_MESSAGE *pool_pending_message_get_previous_message(void);
extern void dump_pending_message(void);
extern void pool_set_major_version(int major);
extern int pool_get_major_version(void);
POOL_QUERY_CONTEXT *query_context = session_context->query_context;
POOL_SYNC_MAP_STATE use_sync_map = pool_use_sync_map();
POOL_PENDING_MESSAGE *msg = NULL;
- static POOL_PENDING_MESSAGE *previous_msg = NULL;
+ POOL_PENDING_MESSAGE *previous_message;
bool do_this_node_id;
int num_executed_nodes = 0;
if (STREAM && pool_get_session_context(true) && pool_is_doing_extended_query_message())
{
msg = pool_pending_message_pull_out();
+ previous_message = pool_pending_message_get_previous_message();
if (!msg)
{
/*
* are receiving data rows. If so, previous_msg must exist and the
* query must be SELECT.
*/
- if (previous_msg == NULL)
+ if (previous_message == NULL)
{
/* no previous message. let's unset query in progress flag. */
ereport(DEBUG1,
else
{
/*
- * previous message exists. Let's see if it could return
+ * Previous message exists. Let's see if it could return
* rows. If not, we cannot predict what kind of message will
* arrive, so just unset query in progress.
*/
- if (previous_msg->is_rows_returned)
+ if (previous_message->is_rows_returned)
{
ereport(DEBUG1,
(errmsg("read_kind_from_backend: no pending message, previous message exists, rows returning")));
- session_context->query_context = previous_msg->query_context;
+ session_context->query_context = previous_message->query_context;
pool_set_query_in_progress();
}
else
ereport(LOG,
(errmsg("read_kind_from_backend: pending message exists. query context: %x",
msg->query_context)));
- previous_msg = msg;
+ pool_pending_message_set_previous_message(msg);
session_context->query_context = msg->query_context;
pool_set_query_in_progress();
}
*/
pool_unset_ignore_till_sync();
+ /* Reset previous message */
+ pool_pending_message_reset_previous_message();
+
/* Get session context */
session_context = pool_get_session_context(false);
use_sync_map = pool_use_sync_map();
/*
* XXX: discard rest of ReadyForQuery packet
*/
+
if (pool_read_message_length(backend) < 0)
return POOL_END;
for (i=0;i<NUM_BACKENDS;i++)
{
+ if (!VALID_BACKEND(i))
+ continue;
+
+#ifdef NOT_USED
if (!VALID_BACKEND(i) || use_sync_map == POOL_SYNC_MAP_EMPTY)
continue;
{
continue;
}
+#endif
if (pool_read(CONNECTION(backend, i), &kind, sizeof(kind)))
return POOL_END;
pool_set_doing_extended_query_message();
if (pool_is_ignore_till_sync())
pool_unset_ignore_till_sync();
- if (!pool_is_query_in_progress())
+
+ if (STREAM)
+ pool_unset_query_in_progress();
+ else if (!pool_is_query_in_progress())
pool_set_query_in_progress();
status = SimpleForwardToBackend(fkind, frontend, backend, len, contents);
pool_unset_pending_response();
{
pool_set_ignore_till_sync();
pool_unset_query_in_progress();
+
+ /* Remove all pending messages */
+ while (pool_pending_message_pull_out())
+ ;
+ pool_pending_message_reset_previous_message();
}
break;