diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 3a43c09bf6..6b5b326c58 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -976,6 +976,9 @@ static const SchemaQuery Query_for_list_of_statistics = {
 "       and pg_catalog.pg_table_is_visible(c2.oid)"\
 "       and c2.relispartition = 'true'"
 
+#define Query_for_list_of_cursors \
+" SELECT name FROM pg_cursors"\
+
 /*
  * These object types were introduced later than our support cutoff of
  * server version 7.4.  We use the VersionedQuery infrastructure so that
@@ -2284,6 +2287,10 @@ psql_completion(const char *text, int start, int end)
 		COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures, NULL);
 	else if (Matches("CALL", MatchAny))
 		COMPLETE_WITH("(");
+/* CLOSE */
+	else if (Matches("CLOSE"))
+		COMPLETE_WITH_QUERY(Query_for_list_of_cursors
+							" UNION ALL SELECT 'ALL'");
 /* CLUSTER */
 	else if (Matches("CLUSTER"))
 		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables, "UNION SELECT 'VERBOSE'");
@@ -3166,26 +3173,44 @@ psql_completion(const char *text, int start, int end)
 /* FETCH && MOVE */
 
 	/*
-	 * Complete FETCH with one of ABSOLUTE, BACKWARD, FORWARD, RELATIVE, ALL,
-	 * NEXT, PRIOR, FIRST, LAST
+	 * Complete FETCH with a list of cursors and one of ABSOLUTE, BACKWARD, FORWARD, RELATIVE, ALL,
+	 * NEXT, PRIOR, FIRST, LAST, FROM, IN
 	 */
 	else if (Matches("FETCH|MOVE"))
-		COMPLETE_WITH("ABSOLUTE", "BACKWARD", "FORWARD", "RELATIVE",
-					  "ALL", "NEXT", "PRIOR", "FIRST", "LAST");
-
-	/* Complete FETCH BACKWARD or FORWARD with one of ALL, FROM, IN */
+        COMPLETE_WITH_QUERY(Query_for_list_of_cursors
+                            " UNION SELECT 'ABSOLUTE'"
+                            " UNION SELECT 'BACKWARD'"
+                            " UNION SELECT 'FORWARD'"
+                            " UNION SELECT 'RELATIVE'"
+                            " UNION SELECT 'ALL'"
+                            " UNION SELECT 'NEXT'"
+                            " UNION SELECT 'PRIOR'"
+                            " UNION SELECT 'FIRST'"
+                            " UNION SELECT 'LAST'"
+                            " UNION SELECT 'FROM'"
+                            " UNION SELECT 'IN'"                                                       
+                            );
+
+	/* Complete FETCH BACKWARD or FORWARD with a list of cursors and one of ALL, FROM, IN */
 	else if (Matches("FETCH|MOVE", "BACKWARD|FORWARD"))
-		COMPLETE_WITH("ALL", "FROM", "IN");
+        COMPLETE_WITH_QUERY(Query_for_list_of_cursors
+                            " UNION SELECT 'ALL'"
+                            " UNION SELECT 'FROM'"
+                            " UNION SELECT 'IN'"
+                            );
 
-	/*
-	 * Complete FETCH <direction> with "FROM" or "IN". These are equivalent,
-	 * but we may as well tab-complete both: perhaps some users prefer one
-	 * variant or the other.
-	 */
+	/* Complete FETCH <direction> with a list of cursors and "FROM" or "IN" */
 	else if (Matches("FETCH|MOVE", "ABSOLUTE|BACKWARD|FORWARD|RELATIVE",
 					 MatchAnyExcept("FROM|IN")) ||
 			 Matches("FETCH|MOVE", "ALL|NEXT|PRIOR|FIRST|LAST"))
-		COMPLETE_WITH("FROM", "IN");
+		COMPLETE_WITH_QUERY(Query_for_list_of_cursors
+                            " UNION SELECT 'FROM'"
+                            " UNION SELECT 'IN'"
+                            );
+	/* Complete FETCH <direction> FROM or IN with a list of cursors */
+    else if (HeadMatches("FETCH|MOVE") &&
+             TailMatches("FROM|IN"))
+        COMPLETE_WITH_QUERY(Query_for_list_of_cursors);
 
 /* FOREIGN DATA WRAPPER */
 	/* applies in ALTER/DROP FDW and in CREATE SERVER */
