diff --git libmariadb/mariadb_stmt.c libmariadb/mariadb_stmt.c
index bbc2831..e66d810 100644
--- libmariadb/mariadb_stmt.c
+++ libmariadb/mariadb_stmt.c
@@ -207,6 +207,24 @@ int mthd_stmt_read_all_rows(MYSQL_STMT *stmt)
 
   while ((packet_len = ma_net_safe_read(stmt->mysql, &is_data_packet)) != packet_error)
   {
+    // This change is required due to the new algorithm introduced in ProxySQL in #3295.
+    // ********************************************************************************
+    // DETAILS:
+    // Since #3295 ProxySQL performs a buffering on the resulset received by a prepared
+    // statement. This way ProxySQL doesn't require to retain the whole result of the
+    // prepared statement in memory. For this purpose it's required to free the memory
+    // allocated in 'MYSQL_STMT' via 'ma_free_root'. Because of this, local pointers
+    // within this function pointing to the result data gets invalidated due to stack
+    // swapping. Reinitializing then to the current values pointing to the new allocated
+    // memory for 'MYSQL_STMT' is required. Since this only happens when we force
+    // 'stmt->result.rows' to be '1', it's the only case in which these variables
+    // need a reset.
+    if (stmt->result.rows == 1) {
+      result= &stmt->result;
+      pprevious= &result->data->next;
+    }
+    // ********************************************************************************
+
     p= stmt->mysql->net.read_pos;
     // The check is by 'ma_net_safe_read'
     if (p[0] == 0 || is_data_packet)
