diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 1657ec3..ebdd0be 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -5027,12 +5027,12 @@ a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
       <listitem>
        <para>
         Some <application>PL/PgSQL</application> commands allow assigning values
-        to more than one variable at a time, such as SELECT INTO.  Typically,
+        to more than one variable at a time, such as <command>SELECT INTO</command>.  Typically,
         the number of target variables and the number of source variables should
-        match, though <application>PL/PgSQL</application> will use NULL for
+        match, though <application>PL/PgSQL</application> will use <literal>NULL</literal> for
         missing values and extra variables are ignored.  Enabling this check
-        will cause <application>PL/PgSQL</application> to throw a WARNING or
-        ERROR whenever the number of target variables and the number of source
+        will cause <application>PL/PgSQL</application> to throw a <literal>WARNING</literal> or
+        <literal>ERROR</literal> whenever the number of target variables and the number of source
         variables are different.
        </para>
       </listitem>
@@ -5044,7 +5044,7 @@ a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
        <para>
         Enabling this check will cause <application>PL/PgSQL</application> to
         check if a given query returns more than one row when an
-        <literal>INTO</literal> clause is used.  As an INTO statement will only
+        <literal>INTO</literal> clause is used.  As an <literal>INTO</literal> statement will only
         ever use one row, having a query return multiple rows is generally
         either inefficient and/or nondeterministic and therefore is likely an
         error.
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 44e8edb..0d9815b 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3867,7 +3867,7 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
 	 */
 	if (stmt->into)
 	{
-		if (stmt->strict || stmt->mod_stmt || too_many_rows_level >= WARNING)
+		if (stmt->strict || stmt->mod_stmt || too_many_rows_level)
 			tcount = 2;
 		else
 			tcount = 1;
@@ -3981,7 +3981,7 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
 		}
 		else
 		{
-			if (n > 1 && (stmt->strict || stmt->mod_stmt || too_many_rows_level >= WARNING))
+			if (n > 1 && (stmt->strict || stmt->mod_stmt || too_many_rows_level))
 			{
 				char	   *errdetail;
 				int			errlevel;
@@ -3997,7 +3997,7 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
 
 				ereport(errlevel,
 						(errcode(ERRCODE_TOO_MANY_ROWS),
-						 errmsg("query returned more than one row"),
+						 errmsg("SELECT INTO query returned more than one row"),
 						 errdetail ? errdetail_internal("parameters: %s", errdetail) : 0,
 						 use_errhint ? errhint("too_many_rows check of extra_%s is active.",
 									  too_many_rows_level == ERROR ? "errors" : "warnings") : 0));
@@ -6709,17 +6709,17 @@ exec_move_row_from_fields(PLpgSQL_execstate *estate,
 				}
 				else
 				{
-					/* there are no data */
+					/* no source for destination column */
 					value = (Datum) 0;
 					isnull = true;
 					valtype = UNKNOWNOID;
 					valtypmod = -1;
 
 					/* When source value is missing */
-					if (strict_multiassignment_level >= WARNING)
+					if (strict_multiassignment_level)
 							ereport(strict_multiassignment_level,
 									(errcode(ERRCODE_DATATYPE_MISMATCH),
-									 errmsg("Number of evaluated fields does not match expected."),
+									 errmsg("Number of source and target fields in assignment does not match."),
 									 errhint("strict_multi_assignement check of extra_%s is active.",
 										  strict_multiassignment_level == ERROR ? "errors" : "warnings")));
 				}
@@ -6736,19 +6736,20 @@ exec_move_row_from_fields(PLpgSQL_execstate *estate,
 			}
 
 			/*
-			 * When stric_multiassignment extra check is active, then ensure so there
-			 * are not more unassigned source value.
+			 * When strict_multiassignment extra check is active, then ensure
+			 * there are no unassigned source attributes.
 			 */
-			if (strict_multiassignment_level >= WARNING && anum < td_natts)
+			if (strict_multiassignment_level && anum < td_natts)
 			{
+				/* skip dropped columns in the source descriptor */
 				while (anum < td_natts &&
 					   TupleDescAttr(tupdesc, anum)->attisdropped)
-					anum++;			/* skip dropped column in tuple */
+					anum++;
 
 				if (anum < td_natts)
 					ereport(strict_multiassignment_level,
 							(errcode(ERRCODE_DATATYPE_MISMATCH),
-							 errmsg("Number of evaluated fields does not match expected."),
+							 errmsg("Number of source and target fields in assignment does not match."),
 							 errhint("strict_multi_assignement check of extra_%s is active.",
 								  strict_multiassignment_level == ERROR ? "errors" : "warnings")));
 			}
@@ -6809,16 +6810,16 @@ exec_move_row_from_fields(PLpgSQL_execstate *estate,
 			}
 			else
 			{
+				/* no source for destination column */
 				value = (Datum) 0;
 				isnull = true;
 				valtype = UNKNOWNOID;
 				valtypmod = -1;
 
-				/* When source value is missing */
-				if (strict_multiassignment_level >= WARNING)
+				if (strict_multiassignment_level)
 						ereport(strict_multiassignment_level,
 								(errcode(ERRCODE_DATATYPE_MISMATCH),
-								 errmsg("Number of evaluated fields does not match expected."),
+								 errmsg("Number of source and target fields in assignment does not match."),
 								 errhint("strict_multi_assignement check of extra_%s is active.",
 									  strict_multiassignment_level == ERROR ? "errors" : "warnings")));
 			}
@@ -6828,10 +6829,10 @@ exec_move_row_from_fields(PLpgSQL_execstate *estate,
 		}
 
 		/*
-		 * When stric_multiassignment extra check is active, then ensure so there
-		 * are not more unassigned source value.
+		 * When strict_multiassignment extra check is active, ensure there
+		 * are no unassigned source attributes.
 		 */
-		if (strict_multiassignment_level >= WARNING && anum < td_natts)
+		if (strict_multiassignment_level && anum < td_natts)
 		{
 			while (anum < td_natts &&
 				   TupleDescAttr(tupdesc, anum)->attisdropped)
@@ -6840,7 +6841,7 @@ exec_move_row_from_fields(PLpgSQL_execstate *estate,
 			if (anum < td_natts)
 				ereport(strict_multiassignment_level,
 						(errcode(ERRCODE_DATATYPE_MISMATCH),
-						 errmsg("Number of evaluated fields does not match expected."),
+						 errmsg("Number of source and target fields in assignment does not match."),
 						 errhint("strict_multi_assignement check of extra_%s is active.",
 							  strict_multiassignment_level == ERROR ? "errors" : "warnings")));
 		}
