diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 584f4f1..40560ac 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -467,7 +467,12 @@ standard_ProcessUtility(PlannedStmt *pstmt,
 							ListCell   *cell;
 							char	   *name = NULL;
 
-							RequireTransactionChain(isTopLevel, "SAVEPOINT");
+							if (!IsTransactionBlock())
+								ereport(ERROR,
+										(errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION),
+										 /* translator: %s represents an SQL statement name */
+										 errmsg("%s can only be used in transaction blocks",
+					"SAVEPOINT")));
 
 							foreach(cell, stmt->options)
 							{
@@ -484,12 +489,22 @@ standard_ProcessUtility(PlannedStmt *pstmt,
 						break;
 
 					case TRANS_STMT_RELEASE:
-						RequireTransactionChain(isTopLevel, "RELEASE SAVEPOINT");
+						if (!IsTransactionBlock())
+							ereport(ERROR,
+									(errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION),
+									 /* translator: %s represents an SQL statement name */
+									 errmsg("%s can only be used in transaction blocks",
+											"RELEASE SAVEPOINT")));
 						ReleaseSavepoint(stmt->options);
 						break;
 
 					case TRANS_STMT_ROLLBACK_TO:
-						RequireTransactionChain(isTopLevel, "ROLLBACK TO SAVEPOINT");
+						if (!IsTransactionBlock())
+							ereport(ERROR,
+									(errcode(ERRCODE_NO_ACTIVE_SQL_TRANSACTION),
+									 /* translator: %s represents an SQL statement name */
+									 errmsg("%s can only be used in transaction blocks",
+											"ROLLBACK TO SAVEPOINT")));
 						RollbackToSavepoint(stmt->options);
 
 						/*
