mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Expose quote_literal_cstr() from core.
This eliminates the need for inefficient implementions of this functionality in both contrib/dblink and contrib/tablefunc, so remove them. The upcoming patch implementing an in-core format() function will also require this functionality. In passing, add some regression tests.
This commit is contained in:
parent
e8bf683fbe
commit
4343c0e546
@ -91,7 +91,6 @@ static char **get_text_array_contents(ArrayType *array, int *numitems);
|
|||||||
static char *get_sql_insert(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals);
|
static char *get_sql_insert(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals);
|
||||||
static char *get_sql_delete(Relation rel, int *pkattnums, int pknumatts, char **tgt_pkattvals);
|
static char *get_sql_delete(Relation rel, int *pkattnums, int pknumatts, char **tgt_pkattvals);
|
||||||
static char *get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals);
|
static char *get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals, char **tgt_pkattvals);
|
||||||
static char *quote_literal_cstr(char *rawstr);
|
|
||||||
static char *quote_ident_cstr(char *rawstr);
|
static char *quote_ident_cstr(char *rawstr);
|
||||||
static int get_attnum_pk_pos(int *pkattnums, int pknumatts, int key);
|
static int get_attnum_pk_pos(int *pkattnums, int pknumatts, int key);
|
||||||
static HeapTuple get_tuple_of_interest(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals);
|
static HeapTuple get_tuple_of_interest(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals);
|
||||||
@ -1893,25 +1892,6 @@ get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals
|
|||||||
return (buf.data);
|
return (buf.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return a properly quoted literal value.
|
|
||||||
* Uses quote_literal in quote.c
|
|
||||||
*/
|
|
||||||
static char *
|
|
||||||
quote_literal_cstr(char *rawstr)
|
|
||||||
{
|
|
||||||
text *rawstr_text;
|
|
||||||
text *result_text;
|
|
||||||
char *result;
|
|
||||||
|
|
||||||
rawstr_text = cstring_to_text(rawstr);
|
|
||||||
result_text = DatumGetTextP(DirectFunctionCall1(quote_literal,
|
|
||||||
PointerGetDatum(rawstr_text)));
|
|
||||||
result = text_to_cstring(result_text);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a properly quoted identifier.
|
* Return a properly quoted identifier.
|
||||||
* Uses quote_ident in quote.c
|
* Uses quote_ident in quote.c
|
||||||
|
@ -85,7 +85,6 @@ static Tuplestorestate *build_tuplestore_recursively(char *key_fld,
|
|||||||
MemoryContext per_query_ctx,
|
MemoryContext per_query_ctx,
|
||||||
AttInMetadata *attinmeta,
|
AttInMetadata *attinmeta,
|
||||||
Tuplestorestate *tupstore);
|
Tuplestorestate *tupstore);
|
||||||
static char *quote_literal_cstr(char *rawstr);
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -1564,22 +1563,3 @@ compatCrosstabTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc)
|
|||||||
/* OK, the two tupdescs are compatible for our purposes */
|
/* OK, the two tupdescs are compatible for our purposes */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return a properly quoted literal value.
|
|
||||||
* Uses quote_literal in quote.c
|
|
||||||
*/
|
|
||||||
static char *
|
|
||||||
quote_literal_cstr(char *rawstr)
|
|
||||||
{
|
|
||||||
text *rawstr_text;
|
|
||||||
text *result_text;
|
|
||||||
char *result;
|
|
||||||
|
|
||||||
rawstr_text = cstring_to_text(rawstr);
|
|
||||||
result_text = DatumGetTextP(DirectFunctionCall1(quote_literal,
|
|
||||||
PointerGetDatum(rawstr_text)));
|
|
||||||
result = text_to_cstring(result_text);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
@ -33,8 +33,8 @@ quote_ident(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* quote_literal -
|
* quote_literal_internal -
|
||||||
* returns a properly quoted literal
|
* helper function for quote_literal and quote_literal_cstr
|
||||||
*
|
*
|
||||||
* NOTE: think not to make this function's behavior change with
|
* NOTE: think not to make this function's behavior change with
|
||||||
* standard_conforming_strings. We don't know where the result
|
* 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
|
* will work with either setting. Take a look at what dblink
|
||||||
* uses this for before thinking you know better.
|
* 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
|
Datum
|
||||||
quote_literal(PG_FUNCTION_ARGS)
|
quote_literal(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
@ -58,32 +89,32 @@ quote_literal(PG_FUNCTION_ARGS)
|
|||||||
cp1 = VARDATA(t);
|
cp1 = VARDATA(t);
|
||||||
cp2 = VARDATA(result);
|
cp2 = VARDATA(result);
|
||||||
|
|
||||||
for (; len-- > 0; cp1++)
|
SET_VARSIZE(result, VARHDRSZ + quote_literal_internal(cp2, cp1, len));
|
||||||
{
|
|
||||||
if (*cp1 == '\\')
|
|
||||||
{
|
|
||||||
*cp2++ = ESCAPE_STRING_SYNTAX;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
len = VARSIZE(t) - VARHDRSZ;
|
|
||||||
cp1 = VARDATA(t);
|
|
||||||
|
|
||||||
*cp2++ = '\'';
|
|
||||||
while (len-- > 0)
|
|
||||||
{
|
|
||||||
if (SQL_STR_DOUBLE(*cp1, true))
|
|
||||||
*cp2++ = *cp1;
|
|
||||||
*cp2++ = *cp1++;
|
|
||||||
}
|
|
||||||
*cp2++ = '\'';
|
|
||||||
|
|
||||||
SET_VARSIZE(result, cp2 - ((char *) result));
|
|
||||||
|
|
||||||
PG_RETURN_TEXT_P(result);
|
PG_RETURN_TEXT_P(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* quote_literal_cstr -
|
||||||
|
* returns a properly quoted literal
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
quote_literal_cstr(char *rawstr)
|
||||||
|
{
|
||||||
|
char *result;
|
||||||
|
int len;
|
||||||
|
int newlen;
|
||||||
|
|
||||||
|
len = strlen(rawstr);
|
||||||
|
/* We make a worst-case result area; wasting a little space is OK */
|
||||||
|
result = palloc(len * 2 + 3);
|
||||||
|
|
||||||
|
newlen = quote_literal_internal(result, rawstr, len);
|
||||||
|
result[newlen] = '\0';
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* quote_nullable -
|
* quote_nullable -
|
||||||
* Returns a properly quoted literal, with null values returned
|
* Returns a properly quoted literal, with null values returned
|
||||||
|
@ -977,6 +977,7 @@ extern int32 type_maximum_size(Oid type_oid, int32 typemod);
|
|||||||
/* quote.c */
|
/* quote.c */
|
||||||
extern Datum quote_ident(PG_FUNCTION_ARGS);
|
extern Datum quote_ident(PG_FUNCTION_ARGS);
|
||||||
extern Datum quote_literal(PG_FUNCTION_ARGS);
|
extern Datum quote_literal(PG_FUNCTION_ARGS);
|
||||||
|
extern char *quote_literal_cstr(char *rawstr);
|
||||||
extern Datum quote_nullable(PG_FUNCTION_ARGS);
|
extern Datum quote_nullable(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
/* guc.c */
|
/* guc.c */
|
||||||
|
@ -118,3 +118,21 @@ select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) ord
|
|||||||
5 | ahoj | ahoj
|
5 | ahoj | ahoj
|
||||||
(11 rows)
|
(11 rows)
|
||||||
|
|
||||||
|
select quote_literal('');
|
||||||
|
quote_literal
|
||||||
|
---------------
|
||||||
|
''
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select quote_literal('abc''');
|
||||||
|
quote_literal
|
||||||
|
---------------
|
||||||
|
'abc'''
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
select quote_literal(e'\\');
|
||||||
|
quote_literal
|
||||||
|
---------------
|
||||||
|
E'\\'
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
@ -41,3 +41,6 @@ select concat_ws('',10,20,null,30);
|
|||||||
select concat_ws(NULL,10,20,null,30) is null;
|
select concat_ws(NULL,10,20,null,30) is null;
|
||||||
select reverse('abcde');
|
select reverse('abcde');
|
||||||
select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i;
|
select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i;
|
||||||
|
select quote_literal('');
|
||||||
|
select quote_literal('abc''');
|
||||||
|
select quote_literal(e'\\');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user