--- sql/pgsql/parser3pgsql.C 2012/06/15 09:09:33 1.41 +++ sql/pgsql/parser3pgsql.C 2012/10/19 04:15:47 1.43 @@ -15,7 +15,7 @@ #include #include -volatile const char * IDENT_PARSER3PGSQL_C="$Id: parser3pgsql.C,v 1.41 2012/06/15 09:09:33 moko Exp $" IDENT_PA_SQL_DRIVER_H; +volatile const char * IDENT_PARSER3PGSQL_C="$Id: parser3pgsql.C,v 1.43 2012/10/19 04:15:47 misha Exp $" IDENT_PA_SQL_DRIVER_H; // from catalog/pg_type.h #define BOOLOID 16 @@ -100,6 +100,7 @@ struct Connection { const char* client_charset; bool autocommit; bool without_default_transactions; + bool standard_conforming_strings; }; /** @@ -134,7 +135,8 @@ public: charset=value& // transcode by server with 'SET CLIENT_ENCODING=value' datestyle=value& // 'SET DATESTYLE=value' available values are: ISO|SQL|Postgres|European|US|German [default=ISO] autocommit=1& // each transaction is commited automatically (default) - WithoutDefaultTransaction=0 // 1 -- disable any BEGIN TRAN/COMMIT/ROLLBACK [can NOT be used with autocommit option] + standard_conforming_strings=1& // 0 -- escape \ char that could be needed for old servers + WithoutDefaultTransaction=0 // 1 -- disable any BEGIN TRAN/COMMIT/ROLLBACK [can NOT be used with autocommit option] */ void connect( char* url, @@ -158,6 +160,7 @@ public: connection.client_charset=0; connection.autocommit=true; connection.without_default_transactions=false; + connection.standard_conforming_strings=true; connection.conn=PQsetdbLogin( (host&&strcasecmp(host, "local")==0)?NULL/* local Unix domain socket */:host, port, @@ -192,6 +195,9 @@ public: connection.without_default_transactions=true; connection.autocommit=false; } + } else if(strcasecmp(key, "standard_conforming_strings")==0){ + if(atoi(value)==0) + connection.standard_conforming_strings=false; } else services._throw("unknown connect option" /*key*/); } else @@ -244,36 +250,52 @@ public: // 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); + 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++='\''; - break; - case '\\': // "\" -> "\\" - *to++='\\'; - break; + if(connection.standard_conforming_strings){ + for(from=str; from "''" + *to++=*from; + } + } else { + for(from=str; from "''" + *to++= '\''; + break; + case '\\': // "\" -> "\\" + *to++='\\'; + break; + } + *to++=*from; } - *to++=*from; } *to=0;