@@ -79,6 +79,7 @@ static Tuplestorestate *build_tuplestore_recursively(char *key_fld,
79
79
MemoryContext per_query_ctx ,
80
80
AttInMetadata * attinmeta ,
81
81
Tuplestorestate * tupstore );
82
+ static char * quote_literal_cstr (char * rawstr );
82
83
83
84
typedef struct
84
85
{
@@ -1319,23 +1320,23 @@ build_tuplestore_recursively(char *key_fld,
1319
1320
/* Build initial sql statement */
1320
1321
if (!show_serial )
1321
1322
{
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" ,
1323
1324
key_fld ,
1324
1325
parent_key_fld ,
1325
1326
relname ,
1326
1327
parent_key_fld ,
1327
- start_with ,
1328
+ quote_literal_cstr ( start_with ) ,
1328
1329
key_fld ,key_fld ,parent_key_fld );
1329
1330
serial_column = 0 ;
1330
1331
}
1331
1332
else
1332
1333
{
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" ,
1334
1335
key_fld ,
1335
1336
parent_key_fld ,
1336
1337
relname ,
1337
1338
parent_key_fld ,
1338
- start_with ,
1339
+ quote_literal_cstr ( start_with ) ,
1339
1340
key_fld ,key_fld ,parent_key_fld ,
1340
1341
orderby_fld );
1341
1342
serial_column = 1 ;
@@ -1691,3 +1692,21 @@ make_crosstab_tupledesc(TupleDesc spi_tupdesc, int num_categories)
1691
1692
1692
1693
return tupdesc ;
1693
1694
}
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
+ }