]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix *escape* handling in copy_statement_with_parameters(was my fault).
authorHiroshi Inoue <inoue@tpf.co.jp>
Mon, 18 Jun 2001 02:16:09 +0000 (02:16 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Mon, 18 Jun 2001 02:16:09 +0000 (02:16 +0000)
src/interfaces/odbc/convert.c

index 62fb91bb1b970e3611d4b5cdb3a71c8f0de6dfff..09c6ca81f558a0affde9a8aaf91aed3ad1cc13e5 100644 (file)
@@ -945,7 +945,7 @@ copy_statement_with_parameters(StatementClass *stmt)
        int                     param_number;
        Int2            param_ctype,
                                param_sqltype;
-       char       *old_statement = stmt->statement;
+       char       *old_statement = stmt->statement, oldchar;
        char       *new_statement = stmt->stmt_with_params;
        unsigned int    new_stsize = 0;
        SIMPLE_TIME st;
@@ -999,10 +999,11 @@ copy_statement_with_parameters(StatementClass *stmt)
 
        for (opos = 0; opos < oldstmtlen; opos++)
        {
+               oldchar = old_statement[opos];
 #ifdef MULTIBYTE
-               if (multibyte_char_check(old_statement[opos]) != 0)
+               if (multibyte_char_check(oldchar) != 0)
                {
-                       CVT_APPEND_CHAR(old_statement[opos]);
+                       CVT_APPEND_CHAR(oldchar);
                        continue;
                }
                /*
@@ -1010,35 +1011,37 @@ copy_statement_with_parameters(StatementClass *stmt)
                 *      1-byte character.
                 */
 #endif
-               /* Squeeze carriage-return/linefeed pairs to linefeed only */
-               if (old_statement[opos] == '\r' && opos + 1 < oldstmtlen &&
-                       old_statement[opos + 1] == '\n')
-                       continue;
 
-               else if (in_escape) /* escape check */
+               if (in_escape) /* escape check */
                {
                        in_escape = FALSE;
-                       CVT_APPEND_CHAR(old_statement[opos]);
+                       CVT_APPEND_CHAR(oldchar);
                        continue;
                }       
                else if (in_quote || in_dquote) /* quote/double quote check */
                {
-                       if (old_statement[opos] == '\'' && in_quote)
+                       if (oldchar == '\\')
+                               in_escape = TRUE;
+                       else if (oldchar == '\'' && in_quote)
                                in_quote = FALSE;
-                       else if (old_statement[opos] == '\"' && in_dquote)
+                       else if (oldchar == '\"' && in_dquote)
                                in_dquote = FALSE;
-                       CVT_APPEND_CHAR(old_statement[opos]);
+                       CVT_APPEND_CHAR(oldchar);
                        continue;       
                }
                /*
                 *      From here we are guranteed to be in neither
-                *      an escape nor a quote nor a double quote.
+                *      an escape, a quote nor a double quote.
                 */
+               /* Squeeze carriage-return/linefeed pairs to linefeed only */
+               else if (oldchar == '\r' && opos + 1 < oldstmtlen &&
+                       old_statement[opos + 1] == '\n')
+                       continue;
                /*
                 * Handle literals (date, time, timestamp) and ODBC scalar
                 * functions
                 */
-               else if (old_statement[opos] == '{')
+               else if (oldchar == '{')
                {
                        char       *esc;
                        char       *begin = &old_statement[opos + 1];
@@ -1064,7 +1067,7 @@ copy_statement_with_parameters(StatementClass *stmt)
                        else
                        {                                       /* it's not a valid literal so just copy */
                                *end = '}';
-                               CVT_APPEND_CHAR(old_statement[opos]);
+                               CVT_APPEND_CHAR(oldchar);
                                continue;
                        }
 
@@ -1078,15 +1081,15 @@ copy_statement_with_parameters(StatementClass *stmt)
                 * so. All the queries I've seen expect the driver to put quotes
                 * if needed.
                 */
-               else if (old_statement[opos] == '?')
+               else if (oldchar == '?')
                        ;                                       /* ok */
                else
                {
-                       if (old_statement[opos] == '\'')
+                       if (oldchar == '\'')
                                in_quote = TRUE;
-                       else if (old_statement[opos] == '\\')
+                       else if (oldchar == '\\')
                                in_escape = TRUE;
-                       else if (old_statement[opos] == '\"')
+                       else if (oldchar == '\"')
                                in_dquote = TRUE;
                        else if (check_select_into && /* select into check */
                                 opos > 0 &&
@@ -1097,7 +1100,7 @@ copy_statement_with_parameters(StatementClass *stmt)
                                memmove(new_statement, new_statement + declare_pos, npos - declare_pos);
                                npos -= declare_pos;
                        }
-                       CVT_APPEND_CHAR(old_statement[opos]);
+                       CVT_APPEND_CHAR(oldchar);
                        continue;
                }