]> granicus.if.org Git - postgresql/commitdiff
Fixed handling of escape character in libecpg.
authorMichael Meskes <meskes@postgresql.org>
Thu, 26 Oct 2017 08:16:04 +0000 (10:16 +0200)
committerMichael Meskes <meskes@postgresql.org>
Thu, 26 Oct 2017 08:16:04 +0000 (10:16 +0200)
Patch by Tsunakawa Takayuki <tsunakawa.takay@jp.fujitsu.com>

src/interfaces/ecpg/ecpglib/execute.c

index 50f831aa2b0c9edf9ccccf3176d780d10152c213..7776813d1b4f404317459848dac4ee0dfacd3081 100644 (file)
@@ -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);