diff --git a/src/context/pool_query_context.c b/src/context/pool_query_context.c
index 83c0a2b2..c200ad52 100644
--- a/src/context/pool_query_context.c
+++ b/src/context/pool_query_context.c
@@ -802,6 +802,7 @@ pool_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 	POOL_CONNECTION *frontend;
 	POOL_CONNECTION_POOL *backend;
 	bool		is_commit;
+	bool		is_savepoint;
 	bool		is_begin_read_write;
 	int			i;
 	int			len;
@@ -811,6 +812,7 @@ pool_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 	frontend = session_context->frontend;
 	backend = session_context->backend;
 	is_commit = is_commit_or_rollback_query(query_context->parse_tree);
+	is_savepoint = is_savepoint_query(query_context->parse_tree);
 	is_begin_read_write = false;
 	len = 0;
 	string = NULL;
@@ -851,9 +853,12 @@ pool_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 
 		/*
 		 * If we are in streaming replication mode or logical replication mode,
-		 * we do not send COMMIT/ABORT to standbys if it's in I (idle) state.
+		 * we do not send COMMIT/ABORT/SAVEPOINT etc. to standbys if it's in I (idle) state.
+		 * This could happen when a multi-statement query includes INSERT/UPDATE. Because
+		 * the multi-statement is transformed into a single-statement query by the minimal-parser and
+		 * Pgpool-II does not recognize a transaction is started by a multi-statement query.
 		 */
-		if (is_commit && MAIN_REPLICA && !IS_MAIN_NODE_ID(i) && TSTATE(backend, i) == 'I')
+		if ((is_commit || is_savepoint) && MAIN_REPLICA && !IS_MAIN_NODE_ID(i) && TSTATE(backend, i) == 'I')
 		{
 			pool_unset_node_to_be_sent(query_context, i);
 			continue;
