@ -33,8 +33,8 @@ quote_ident(PG_FUNCTION_ARGS)
}
/*
* quote_literal -
* returns a properly quoted literal
* quote_literal_internal -
* helper function for quote_literal and quote_literal_cstr
*
* NOTE : think not to make this function ' s behavior change with
* standard_conforming_strings . We don ' t know where the result
@ -42,6 +42,37 @@ quote_ident(PG_FUNCTION_ARGS)
* will work with either setting . Take a look at what dblink
* uses this for before thinking you know better .
*/
static size_t
quote_literal_internal ( char * dst , char * src , size_t len )
{
char * s ;
char * savedst = dst ;
for ( s = src ; s < src + len ; s + + )
{
if ( * s = = ' \\ ' )
{
* dst + + = ESCAPE_STRING_SYNTAX ;
break ;
}
}
* dst + + = ' \' ' ;
while ( len - - > 0 )
{
if ( SQL_STR_DOUBLE ( * src , true ) )
* dst + + = * src ;
* dst + + = * src + + ;
}
* dst + + = ' \' ' ;
return dst - savedst ;
}
/*
* quote_literal -
* returns a properly quoted literal
*/
Datum
quote_literal ( PG_FUNCTION_ARGS )
{
@ -58,30 +89,30 @@ quote_literal(PG_FUNCTION_ARGS)
cp1 = VARDATA ( t ) ;
cp2 = VARDATA ( result ) ;
for ( ; len - - > 0 ; cp1 + + )
{
if ( * cp1 = = ' \\ ' )
{
* cp2 + + = ESCAPE_STRING_SYNTAX ;
break ;
}
}
SET_VARSIZE ( result , VARHDRSZ + quote_literal_internal ( cp2 , cp1 , len ) ) ;
len = VARSIZE ( t ) - VARHDRSZ ;
cp1 = VARDATA ( t ) ;
PG_RETURN_TEXT_P ( result ) ;
}
* cp2 + + = ' \' ' ;
while ( len - - > 0 )
{
if ( SQL_STR_DOUBLE ( * cp1 , true ) )
* cp2 + + = * cp1 ;
* cp2 + + = * cp1 + + ;
}
* cp2 + + = ' \' ' ;
/*
* quote_literal_cstr -
* returns a properly quoted literal
*/
char *
quote_literal_cstr ( char * rawstr )
{
char * result ;
int len ;
int newlen ;
SET_VARSIZE ( result , cp2 - ( ( char * ) result ) ) ;
len = strlen ( rawstr ) ;
/* We make a worst-case result area; wasting a little space is OK */
result = palloc ( len * 2 + 3 ) ;
PG_RETURN_TEXT_P ( result ) ;
newlen = quote_literal_internal ( result , rawstr , len ) ;
result [ newlen ] = ' \0 ' ;
return result ;
}
/*