Commit 0af98a95 authored by Michael Meskes's avatar Michael Meskes

Fixed handling of escape character in libecpg.

Patch by Tsunakawa Takayuki <tsunakawa.takay@jp.fujitsu.com>
parent db6986f4
...@@ -108,14 +108,14 @@ free_statement(struct statement *stmt) ...@@ -108,14 +108,14 @@ free_statement(struct statement *stmt)
} }
static int static int
next_insert(char *text, int pos, bool questionmarks) next_insert(char *text, int pos, bool questionmarks, bool std_strings)
{ {
bool string = false; bool string = false;
int p = pos; int p = pos;
for (; text[p] != '\0'; p++) for (; text[p] != '\0'; p++)
{ {
if (text[p] == '\\') /* escape character */ if (string && !std_strings && text[p] == '\\') /* escape character */
p++; p++;
else if (text[p] == '\'') else if (text[p] == '\'')
string = string ? false : true; string = string ? false : true;
...@@ -1109,6 +1109,13 @@ ecpg_build_params(struct statement *stmt) ...@@ -1109,6 +1109,13 @@ ecpg_build_params(struct statement *stmt)
struct variable *var; struct variable *var;
int desc_counter = 0; int desc_counter = 0;
int position = 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 * 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) ...@@ -1299,7 +1306,7 @@ ecpg_build_params(struct statement *stmt)
* now tobeinserted points to an area that contains the next * now tobeinserted points to an area that contains the next
* parameter; now find the position in the string where it belongs * 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 * We have an argument but we dont have the matched up placeholder
...@@ -1386,7 +1393,7 @@ ecpg_build_params(struct statement *stmt) ...@@ -1386,7 +1393,7 @@ ecpg_build_params(struct statement *stmt)
} }
/* Check if there are unmatched things left. */ /* 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_raise(stmt->lineno, ECPG_TOO_FEW_ARGUMENTS,
ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL); ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS, NULL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment