diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 86ea9cd9da..ff7d77f8e9 100644
--- a/src/backend/commands/extension.c
+++ b/src/backend/commands/extension.c
@@ -692,6 +692,8 @@ script_error_callback(void *arg)
 	const char *query = callback_arg->sql;
 	int			location = callback_arg->stmt_location;
 	int			len = callback_arg->stmt_len;
+	bool		raw_syntaxerr = false;
+	int			syntaxerrline_no = 0;
 	int			syntaxerrposition;
 	const char *lastslash;
 
@@ -730,6 +732,8 @@ script_error_callback(void *arg)
 			location = len = 0;
 			for (int loc = 0; loc < slen; loc++)
 			{
+				if (query[loc] == '\n')
+					syntaxerrline_no++;
 				if (query[loc] != ';')
 					continue;
 				if (query[loc + 1] == '\r')
@@ -766,6 +770,7 @@ script_error_callback(void *arg)
 		errposition(0);
 		internalerrposition(syntaxerrposition);
 		internalerrquery(pnstrdup(query, len));
+		raw_syntaxerr = true;
 	}
 	else if (location >= 0)
 	{
@@ -794,17 +799,22 @@ script_error_callback(void *arg)
 	 */
 	if (location >= 0)
 	{
-		int			linenumber = 1;
-
-		for (query = callback_arg->sql; *query; query++)
+		if (!raw_syntaxerr)
 		{
-			if (--location < 0)
-				break;
-			if (*query == '\n')
-				linenumber++;
+			int			linenumber = 1;
+			for (query = callback_arg->sql; *query; query++)
+			{
+				if (--location < 0)
+					break;
+				if (*query == '\n')
+					linenumber++;
+			}
+			errcontext("extension script file \"%s\", near line %d",
+					lastslash, linenumber);
 		}
-		errcontext("extension script file \"%s\", near line %d",
-				   lastslash, linenumber);
+		else
+			errcontext("extension script file \"%s\", near line %d",
+					lastslash, syntaxerrline_no);
 	}
 	else
 		errcontext("extension script file \"%s\"", lastslash);
