Apply quote_literal to the start_with argument of connectby. Fixes problem
authorJoe Conway
Tue, 24 Feb 2004 05:25:36 +0000 (05:25 +0000)
committerJoe Conway
Tue, 24 Feb 2004 05:25:36 +0000 (05:25 +0000)
reported by David Garamond when working with bytea parent and child keys.

contrib/tablefunc/tablefunc.c

index 74f20c5061cf3518fcbe543fc71ef5631577821e..622164b91b551320aeaee1570bd395ad43ee88ff 100644 (file)
@@ -79,6 +79,7 @@ static Tuplestorestate *build_tuplestore_recursively(char *key_fld,
                             MemoryContext per_query_ctx,
                             AttInMetadata *attinmeta,
                             Tuplestorestate *tupstore);
+static char *quote_literal_cstr(char *rawstr);
 
 typedef struct
 {
@@ -1319,23 +1320,23 @@ build_tuplestore_recursively(char *key_fld,
    /* Build initial sql statement */
    if (!show_serial)
    {
-       appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL AND %s <> %s",
+       appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL AND %s <> %s",
                         key_fld,
                         parent_key_fld,
                         relname,
                         parent_key_fld,
-                        start_with,
+                        quote_literal_cstr(start_with),
                         key_fld, key_fld, parent_key_fld);
        serial_column = 0;
    }
    else
    {
-       appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL AND %s <> %s ORDER BY %s",
+       appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL AND %s <> %s ORDER BY %s",
                         key_fld,
                         parent_key_fld,
                         relname,
                         parent_key_fld,
-                        start_with,
+                        quote_literal_cstr(start_with),
                         key_fld, key_fld, parent_key_fld,
                         orderby_fld);
        serial_column = 1;
@@ -1691,3 +1692,21 @@ make_crosstab_tupledesc(TupleDesc spi_tupdesc, int num_categories)
 
    return tupdesc;
 }
+
+/*
+ * 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 = DatumGetTextP(DirectFunctionCall1(textin, CStringGetDatum(rawstr)));
+   result_text = DatumGetTextP(DirectFunctionCall1(quote_literal, PointerGetDatum(rawstr_text)));
+   result = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(result_text)));
+
+   return result;
+}