diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
new file mode 100644
index 4147457..ad81995
*** a/src/backend/commands/tablecmds.c
--- b/src/backend/commands/tablecmds.c
*************** RenameConstraint(RenameStmt *stmt)
*** 2496,2504 ****
  	{
  		/* lock level taken here should match rename_constraint_internal */
  		relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock,
! 										 false, false,
  										 RangeVarCallbackForRenameAttribute,
  										 NULL);
  	}
  
  	return
--- 2496,2511 ----
  	{
  		/* lock level taken here should match rename_constraint_internal */
  		relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock,
! 										 stmt->missing_ok, false,
  										 RangeVarCallbackForRenameAttribute,
  										 NULL);
+ 		if (!OidIsValid(relid))
+ 		{
+ 			ereport(NOTICE,
+ 					(errmsg("relation \"%s\" does not exist, skipping",
+ 							stmt->relation->relname)));
+ 			return InvalidObjectAddress;
+ 		}
  	}
  
  	return
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
new file mode 100644
index 82405b9..4dc9d7f
*** a/src/backend/parser/gram.y
--- b/src/backend/parser/gram.y
*************** RenameStmt: ALTER AGGREGATE func_name ag
*** 7692,7697 ****
--- 7692,7708 ----
  					n->relation = $3;
  					n->subname = $6;
  					n->newname = $8;
+ 					n->missing_ok = false;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
+ 				{
+ 					RenameStmt *n = makeNode(RenameStmt);
+ 					n->renameType = OBJECT_TABCONSTRAINT;
+ 					n->relation = $5;
+ 					n->subname = $8;
+ 					n->newname = $10;
+ 					n->missing_ok = true;
  					$$ = (Node *)n;
  				}
  			| ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
