static void
fn_set_name(ProxyFunction *func, HeapTuple proc_tuple)
{
- char namebuf[NAMEDATALEN * 2 + 3];
+ /* 2 names, size can double, "" + . + "" + NUL */
+ char namebuf[NAMEDATALEN * 4 + 2 + 1 + 2 + 1];
Form_pg_proc proc_struct;
Form_pg_namespace ns_struct;
HeapTuple ns_tup;
plproxy_error(func, "Cannot find namespace %u", nsoid);
ns_struct = (Form_pg_namespace) GETSTRUCT(ns_tup);
- sprintf(namebuf, "%s.%s", NameStr(ns_struct->nspname),
- NameStr(proc_struct->proname));
+ snprintf(namebuf, sizeof(namebuf), "%s.%s",
+ quote_identifier(NameStr(ns_struct->nspname)),
+ quote_identifier(NameStr(proc_struct->proname)));
func->name = plproxy_func_strdup(func, namebuf);
ReleaseSysCache(ns_tup);
{
TupleDesc tupdesc; /* Return tuple descriptor */
ProxyType **type_list; /* Column type info */
- char **name_list; /* Column names */
+ char **name_list; /* Quoted column names */
unsigned use_binary:1; /* True if all columns support binary recv */
} ProxyComposite;
*/
typedef struct ProxyFunction
{
- const char *name; /* Fully-quelified function name */
+ const char *name; /* Fully-qualified and quoted function name */
Oid oid; /* Function OID */
MemoryContext ctx; /* Where runtime allocations should happen */
if (fname == NULL)
plproxy_error(func, "Unnamed result column %d", col + 1);
- if (strcasecmp(aname, fname) == 0)
+ if (strcmp(aname, fname) == 0)
return true;
return false;
}
for (i = 0; i < natts; i++)
{
+ /* ->name_list has quoted names, take unquoted from ->tupdesc */
a = func->ret_composite->tupdesc->attrs[i];
aname = NameStr(a->attname);
if (a->attisdropped)
plproxy_error(func, "dropped attrs not supported");
- name = NameStr(a->attname);
+ name = quote_identifier(NameStr(a->attname));
ret->name_list[i] = plproxy_func_strdup(func, name);
type = plproxy_find_type_info(func, a->atttypid, 0);
t_nsp;
Form_pg_type s_type;
Form_pg_namespace s_nsp;
- char namebuf[NAMEDATALEN * 2 + 3];
+ char namebuf[NAMEDATALEN * 4 + 2 + 1 + 2 + 1];
Oid nsoid;
/* fetch pg_type row */
if (!HeapTupleIsValid(t_nsp))
plproxy_error(func, "cache lookup failed for namespace %u", nsoid);
s_nsp = (Form_pg_namespace) GETSTRUCT(t_nsp);
- sprintf(namebuf, "%s.%s", NameStr(s_nsp->nspname), NameStr(s_type->typname));
+ snprintf(namebuf, sizeof(namebuf), "%s.%s",
+ quote_identifier(NameStr(s_nsp->nspname)),
+ quote_identifier(NameStr(s_type->typname)));
ReleaseSysCache(t_nsp);
}
else
{
- sprintf(namebuf, "%s", NameStr(s_type->typname));
+ snprintf(namebuf, sizeof(namebuf), "%s", quote_identifier(NameStr(s_type->typname)));
}
/* sanity check */