@@ -79,6 +79,7 @@ static Tuplestorestate *build_tuplestore_recursively(char *key_fld,
7979MemoryContext per_query_ctx ,
8080AttInMetadata * attinmeta ,
8181Tuplestorestate * tupstore );
82+ static char * quote_literal_cstr (char * rawstr );
8283
8384typedef struct
8485{
@@ -1319,23 +1320,23 @@ build_tuplestore_recursively(char *key_fld,
13191320/* Build initial sql statement */
13201321if (!show_serial )
13211322{
1322- appendStringInfo (sql ,"SELECT %s, %s FROM %s WHERE %s ='%s' AND %s IS NOT NULL AND %s <> %s" ,
1323+ appendStringInfo (sql ,"SELECT %s, %s FROM %s WHERE %s =%s AND %s IS NOT NULL AND %s <> %s" ,
13231324key_fld ,
13241325parent_key_fld ,
13251326relname ,
13261327parent_key_fld ,
1327- start_with ,
1328+ quote_literal_cstr ( start_with ) ,
13281329key_fld ,key_fld ,parent_key_fld );
13291330serial_column = 0 ;
13301331}
13311332else
13321333{
1333- appendStringInfo (sql ,"SELECT %s, %s FROM %s WHERE %s ='%s' AND %s IS NOT NULL AND %s <> %s ORDER BY %s" ,
1334+ appendStringInfo (sql ,"SELECT %s, %s FROM %s WHERE %s =%s AND %s IS NOT NULL AND %s <> %s ORDER BY %s" ,
13341335key_fld ,
13351336parent_key_fld ,
13361337relname ,
13371338parent_key_fld ,
1338- start_with ,
1339+ quote_literal_cstr ( start_with ) ,
13391340key_fld ,key_fld ,parent_key_fld ,
13401341orderby_fld );
13411342serial_column = 1 ;
@@ -1691,3 +1692,21 @@ make_crosstab_tupledesc(TupleDesc spi_tupdesc, int num_categories)
16911692
16921693return tupdesc ;
16931694}
1695+
1696+ /*
1697+ * Return a properly quoted literal value.
1698+ * Uses quote_literal in quote.c
1699+ */
1700+ static char *
1701+ quote_literal_cstr (char * rawstr )
1702+ {
1703+ text * rawstr_text ;
1704+ text * result_text ;
1705+ char * result ;
1706+
1707+ rawstr_text = DatumGetTextP (DirectFunctionCall1 (textin ,CStringGetDatum (rawstr )));
1708+ result_text = DatumGetTextP (DirectFunctionCall1 (quote_literal ,PointerGetDatum (rawstr_text )));
1709+ result = DatumGetCString (DirectFunctionCall1 (textout ,PointerGetDatum (result_text )));
1710+
1711+ return result ;
1712+ }