--- sql/oracle/parser3oracle.C 2008/07/07 13:25:26 1.71 +++ sql/oracle/parser3oracle.C 2010/10/27 22:48:51 1.73 @@ -8,7 +8,7 @@ 2001.07.30 using Oracle 8.1.6 [@test tested with Oracle 7.x.x] */ -static const char *RCSId="$Id: parser3oracle.C,v 1.71 2008/07/07 13:25:26 misha Exp $"; +static const char *RCSId="$Id: parser3oracle.C,v 1.73 2010/10/27 22:48:51 moko Exp $"; #include "config_includes.h" @@ -155,7 +155,7 @@ struct Connection { struct Options { bool bLowerCaseColumnNames; - bool bAllowLimitQueryModification; + bool bDisableQueryModification; const char* client_charset; } options; }; @@ -224,9 +224,9 @@ static const char *options2env(char *s, continue; } - if(strcmp(key, "AllowLimitQueryModification")==0){ + if(strcmp(key, "DisableQueryModification")==0){ if(options) - options->bAllowLimitQueryModification=atoi(value)!=0; + options->bDisableQueryModification=atoi(value)!=0; continue; } @@ -307,7 +307,7 @@ public: Connection& connection=*(Connection *)services.malloc(sizeof(Connection)); connection.services=&services; connection.options.bLowerCaseColumnNames=true; - connection.options.bAllowLimitQueryModification=true; + connection.options.bDisableQueryModification=false; *connection_ref=&connection; char *user=url; @@ -445,20 +445,33 @@ public: return true; } - const char* quote(void *aconnection, - const char *from, unsigned int length) + // charset here is services.request_charset(), not connection.client_charset + // thus we can't use the sql server quoting support + const char* quote(void *aconnection, const char *str, unsigned int length) { - Connection& connection=*static_cast(aconnection); - char *result=(char*)connection.services->malloc_atomic(length*2+1); - char *to=result; - while(length--) { - switch(*from) { - case '\'': // "'" -> "''" - *to++='\''; - break; - } - *to++=*from++; + const char* from; + const char* from_end=str+length; + + size_t quoted=0; + + for(from=str; from(aconnection); + char *result=(char*)connection.services->malloc_atomic(length + quoted + 1); + char *to = result; + + for(from=str; from '' + *to++=*from; + } + *to=0; return result; } @@ -1059,13 +1072,13 @@ cleanup: // no check call after this poi ){ modified_statement result={astatement, false, false, false}; - if(connection.options.bAllowLimitQueryModification && limit!=SQL_NO_LIMIT && strncasecmp(astatement, "select", 6)==0){ + if(!connection.options.bDisableQueryModification && limit!=SQL_NO_LIMIT && strncasecmp(astatement, "select", 6)==0){ result.limit=true; size_t statement_size=strlen(astatement); char* statement_limited; - if(offset && limit){/* offset and with limit!=0 */ + if(offset && limit/* throwing offset away if limit==0 */){ result.skip_rownum_column=true; result.offset=true; @@ -1091,8 +1104,8 @@ cleanup: // no check call after this poi } else { - // SELECT * FROM (user_query) WHERE ROWNUM<=limit+offset - // this statement must be easy for the server but we can't use it with offset + // SELECT * FROM (user_query) WHERE ROWNUM<=limit + // this statement can be easy for the sql server but we can't use it with offset statement_limited=(char *)connection.services->malloc_atomic( statement_size @@ -1107,7 +1120,7 @@ cleanup: // no check call after this poi strcat(statement_limited, astatement); statement_limited+=15+statement_size; - statement_limited+=snprintf(statement_limited, 16+MAX_NUMBER, ") WHERE ROWNUM<=%u", limit?limit+offset:0); + statement_limited+=snprintf(statement_limited, 16+MAX_NUMBER, ") WHERE ROWNUM<=%u", limit); } *statement_limited=0;