From 65ba1b5c25365d53c69622f2bd658a309c7206bc Mon Sep 17 00:00:00 2001
From: Michael Meskes <meskes@postgresql.org>
Date: Thu, 26 Oct 2017 10:16:04 +0200
Subject: [PATCH] Fixed handling of escape character in libecpg.

Patch by Tsunakawa Takayuki <tsunakawa.takay@jp.fujitsu.com>
---
 src/interfaces/ecpg/ecpglib/execute.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 03c55d35930..ac5717be38d 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -108,14 +108,14 @@ free_statement(struct statement *stmt)
 }
 
 static int
-next_insert(char *text, int pos, bool questionmarks)
+next_insert(char *text, int pos, bool questionmarks, bool std_strings)
 {
 	bool		string = false;
 	int			p = pos;
 
 	for (; text[p] != '\0'; p++)
 	{
-		if (text[p] == '\\')	/* escape character */
+		if (string && !std_strings && text[p] == '\\')	/* escape character */
 			p++;
 		else if (text[p] == '\'')
 			string = string ? false : true;
@@ -1109,6 +1109,13 @@ ecpg_build_params(struct statement *stmt)
 	struct variable *var;
 	int			desc_counter = 0;
 	int			position = 0;
+	const char	   *value;
+	bool		std_strings = false;
+
+	/* Get standard_conforming_strings setting. */
+	value = PQparameterStatus(stmt->connection->connection, "standard_conforming_strings");
+	if (value && strcmp(value, "on") == 0)
+		std_strings = true;
 
 	/*
 	 * If the type is one of the fill in types then we take the argument and
@@ -1299,7 +1306,7 @@ ecpg_build_params(struct statement *stmt)
 		 * now tobeinserted points to an area that contains the next
 		 * parameter; now find the position in the string where it belongs
 		 */
-		if ((position = next_insert(stmt->command, position, stmt->questionmarks) + 1) == 0)
+		if ((position = next_insert(stmt->command, position, stmt->questionmarks, std_strings) + 1) == 0)
 		{
 			/*
 			 * We have an argument but we dont have the matched up placeholder
@@ -1386,7 +1393,7 @@ ecpg_build_params(struct statement *stmt)
 	}
 
 	/* Check if there are unmatched things left. */
-	if (next_insert(stmt->command, position, stmt->questionmarks) >= 0)
+	if (next_insert(stmt->command, position, stmt->questionmarks, std_strings) >= 0)
 	{
 		ecpg_raise(stmt->lineno, ECPG_TOO_FEW_ARGUMENTS,
 				   ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL);
-- 
GitLab