]> granicus.if.org Git - postgresql/commitdiff
pply quote_literal to the start_with argument of connectby. Fixes problem
authorJoe Conway <mail@joeconway.com>
Tue, 24 Feb 2004 05:26:27 +0000 (05:26 +0000)
committerJoe Conway <mail@joeconway.com>
Tue, 24 Feb 2004 05:26:27 +0000 (05:26 +0000)
reported by David Garamond when working with bytea parent and child keys.

contrib/tablefunc/tablefunc.c

index 4fd3846820b3af5c57a06972bd9daf8ddbe9f034..cc8fd613a4733748132d0b97f9895ca5d51618fb 100644 (file)
@@ -66,6 +66,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
 {
@@ -779,12 +780,12 @@ build_tuplestore_recursively(char *key_fld,
                return tupstore;
 
        /* Build initial sql statement */
-       appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = '%s' AND %s IS NOT NULL",
+       appendStringInfo(sql, "SELECT %s, %s FROM %s WHERE %s = %s AND %s IS NOT NULL",
                                         key_fld,
                                         parent_key_fld,
                                         relname,
                                         parent_key_fld,
-                                        start_with,
+                                        quote_literal_cstr(start_with),
                                         key_fld);
 
        /* Retrieve the desired rows */
@@ -1087,3 +1088,21 @@ make_crosstab_tupledesc(TupleDesc spi_tupdesc, int num_catagories)
 
        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;
+}