Accept 't' proargmode, use symbolic names.
authorMarko Kreen <markokr@gmail.com>
Fri, 16 Nov 2012 13:28:45 +0000 (15:28 +0200)
committerMarko Kreen <markokr@gmail.com>
Fri, 16 Nov 2012 13:28:45 +0000 (15:28 +0200)
Also throw error on unknown proargmode.

Fixes crash reported by Sébastien Lardière.

src/function.c
src/plproxy.h

index 61077959345979cb60f8c0d266bca6f23268e241..19b77ade00777bd6b19b8149894720cf93b8a95e 100644 (file)
@@ -356,15 +356,29 @@ fn_get_arguments(ProxyFunction *func,
 
        for (i = 0; i < total; i++)
        {
-               if (modes && modes[i] == 'o')
-                       continue;
-               type = plproxy_find_type_info(func, types[i], 1);
-               pos = func->arg_count++;
-               func->arg_types[pos] = type;
-               if (names && names[i])
-                       func->arg_names[pos] = plproxy_func_strdup(func, names[i]);
-               else
-                       func->arg_names[pos] = NULL;
+               char mode = modes ? modes[i] : PROARGMODE_IN;
+               switch (mode) {
+               case PROARGMODE_IN:
+               case PROARGMODE_INOUT:
+                       type = plproxy_find_type_info(func, types[i], 1);
+                       pos = func->arg_count++;
+                       func->arg_types[pos] = type;
+                       if (names && names[i])
+                               func->arg_names[pos] = plproxy_func_strdup(func, names[i]);
+                       else
+                               func->arg_names[pos] = NULL;
+                       break;
+               case PROARGMODE_VARIADIC:
+                       elog(ERROR, "PL/Proxy does not support variadic args");
+                       break;
+               case PROARGMODE_OUT:
+               case PROARGMODE_TABLE:
+                       /* output args, ignore */
+                       break;
+               default:
+                       elog(ERROR, "PL/Proxy: unknown value in proargmodes: %c", mode);
+                       break;
+               }
        }
 }
 
index da9b9d47528257dd879178221b9380bd8a6f4a5b..38185bd4f36ad7694443902cd20a685616d89990 100644 (file)
 #endif
 #endif
 
+/*
+ * backwards compat with 8.4
+ */
+#ifndef PROARGMODE_IN
+#define PROARGMODE_IN       'i'
+#endif
+#ifndef PROARGMODE_OUT
+#define PROARGMODE_OUT      'o'
+#endif
+#ifndef PROARGMODE_INOUT
+#define PROARGMODE_INOUT    'b'
+#endif
+#ifndef PROARGMODE_VARIADIC
+#define PROARGMODE_VARIADIC 'v'
+#endif
+#ifndef PROARGMODE_TABLE
+#define PROARGMODE_TABLE    't'
+#endif
+
+
 /*
  * Determine if this argument is to SPLIT
  */