mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
Fixed handling of escape character in libecpg.
Patch by Tsunakawa Takayuki <tsunakawa.takay@jp.fujitsu.com>
This commit is contained in:
parent
db6986f47c
commit
0af98a95cf
@ -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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user