Skip to content

Commit 41c377f

Browse files
author
Hiroshi Inoue
committed
Fix *escape* handling in copy_statement_with_parameters(was my fault).
1 parent 6054b33 commit 41c377f

File tree

1 file changed

+23
-20
lines changed

1 file changed

+23
-20
lines changed

src/interfaces/odbc/convert.c

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ copy_statement_with_parameters(StatementClass *stmt)
945945
int param_number;
946946
Int2 param_ctype,
947947
param_sqltype;
948-
char *old_statement = stmt->statement;
948+
char *old_statement = stmt->statement, oldchar;
949949
char *new_statement = stmt->stmt_with_params;
950950
unsigned int new_stsize = 0;
951951
SIMPLE_TIME st;
@@ -999,46 +999,49 @@ copy_statement_with_parameters(StatementClass *stmt)
999999

10001000
for (opos = 0; opos < oldstmtlen; opos++)
10011001
{
1002+
oldchar = old_statement[opos];
10021003
#ifdef MULTIBYTE
1003-
if (multibyte_char_check(old_statement[opos]) != 0)
1004+
if (multibyte_char_check(oldchar) != 0)
10041005
{
1005-
CVT_APPEND_CHAR(old_statement[opos]);
1006+
CVT_APPEND_CHAR(oldchar);
10061007
continue;
10071008
}
10081009
/*
10091010
* From here we are guaranteed to handle a
10101011
* 1-byte character.
10111012
*/
10121013
#endif
1013-
/* Squeeze carriage-return/linefeed pairs to linefeed only */
1014-
if (old_statement[opos] == '\r' && opos + 1 < oldstmtlen &&
1015-
old_statement[opos + 1] == '\n')
1016-
continue;
10171014

1018-
else if (in_escape) /* escape check */
1015+
if (in_escape) /* escape check */
10191016
{
10201017
in_escape = FALSE;
1021-
CVT_APPEND_CHAR(old_statement[opos]);
1018+
CVT_APPEND_CHAR(oldchar);
10221019
continue;
10231020
}
10241021
else if (in_quote || in_dquote) /* quote/double quote check */
10251022
{
1026-
if (old_statement[opos] == '\'' && in_quote)
1023+
if (oldchar == '\\')
1024+
in_escape = TRUE;
1025+
else if (oldchar == '\'' && in_quote)
10271026
in_quote = FALSE;
1028-
else if (old_statement[opos] == '\"' && in_dquote)
1027+
else if (oldchar == '\"' && in_dquote)
10291028
in_dquote = FALSE;
1030-
CVT_APPEND_CHAR(old_statement[opos]);
1029+
CVT_APPEND_CHAR(oldchar);
10311030
continue;
10321031
}
10331032
/*
10341033
* From here we are guranteed to be in neither
1035-
* an escape nor a quote nor a double quote.
1034+
* an escape, a quote nor a double quote.
10361035
*/
1036+
/* Squeeze carriage-return/linefeed pairs to linefeed only */
1037+
else if (oldchar == '\r' && opos + 1 < oldstmtlen &&
1038+
old_statement[opos + 1] == '\n')
1039+
continue;
10371040
/*
10381041
* Handle literals (date, time, timestamp) and ODBC scalar
10391042
* functions
10401043
*/
1041-
else if (old_statement[opos] == '{')
1044+
else if (oldchar == '{')
10421045
{
10431046
char *esc;
10441047
char *begin = &old_statement[opos + 1];
@@ -1064,7 +1067,7 @@ copy_statement_with_parameters(StatementClass *stmt)
10641067
else
10651068
{ /* it's not a valid literal so just copy */
10661069
*end = '}';
1067-
CVT_APPEND_CHAR(old_statement[opos]);
1070+
CVT_APPEND_CHAR(oldchar);
10681071
continue;
10691072
}
10701073

@@ -1078,15 +1081,15 @@ copy_statement_with_parameters(StatementClass *stmt)
10781081
* so. All the queries I've seen expect the driver to put quotes
10791082
* if needed.
10801083
*/
1081-
else if (old_statement[opos] == '?')
1084+
else if (oldchar == '?')
10821085
; /* ok */
10831086
else
10841087
{
1085-
if (old_statement[opos] == '\'')
1088+
if (oldchar == '\'')
10861089
in_quote = TRUE;
1087-
else if (old_statement[opos] == '\\')
1090+
else if (oldchar == '\\')
10881091
in_escape = TRUE;
1089-
else if (old_statement[opos] == '\"')
1092+
else if (oldchar == '\"')
10901093
in_dquote = TRUE;
10911094
else if (check_select_into && /* select into check */
10921095
opos > 0 &&
@@ -1097,7 +1100,7 @@ copy_statement_with_parameters(StatementClass *stmt)
10971100
memmove(new_statement, new_statement + declare_pos, npos - declare_pos);
10981101
npos -= declare_pos;
10991102
}
1100-
CVT_APPEND_CHAR(old_statement[opos]);
1103+
CVT_APPEND_CHAR(oldchar);
11011104
continue;
11021105
}
11031106

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy