Fix argument value NULL check.
authorMarko Kreen <markokr@gmail.com>
Fri, 11 Sep 2009 14:26:32 +0000 (14:26 +0000)
committerMarko Kreen <markokr@gmail.com>
Fri, 11 Sep 2009 14:26:32 +0000 (14:26 +0000)
Incoming NULL value could cause crash in function containing SELECT
with different argument order.  Due to thinko, NULL check was done
with query arg index, instead of function arg index.

Reported by Joรฃo Matos

expected/plproxy_select.out
sql/plproxy_select.sql
src/execute.c

index 352c8291314bde84bf2ffa75a357088230f478dd..55f0e1b8eaea12914c7e07db5b0744ddc9f4c864 100644 (file)
@@ -72,3 +72,65 @@ select * from get_one();
    1 | one
 (1 row)
 
+\c test_part
+create function remote_func(a varchar, b varchar, c varchar)
+returns void as $$
+begin
+    return;
+end;
+$$ language plpgsql;
+\c regression
+CREATE OR REPLACE FUNCTION test1(x integer, a varchar, b varchar, c varchar)
+RETURNS void AS $$
+CLUSTER 'testcluster';
+RUN ON 0;
+SELECT * FROM remote_func(a, b, c);
+$$ LANGUAGE plproxy;
+select * from test1(1, 'a', NULL,NULL);
+ test1 
+-------
+(1 row)
+
+select * from test1(1, NULL, NULL,NULL);
+ test1 
+-------
+(1 row)
+
+CREATE OR REPLACE FUNCTION test2(a varchar, b varchar, c varchar)
+RETURNS void AS $$
+CLUSTER 'testcluster';
+RUN ON 0;
+SELECT * FROM remote_func(a, b, c);
+$$ LANGUAGE plproxy;
+select * from test2(NULL, NULL, NULL);
+ test2 
+-------
+(1 row)
+
+select * from test2('a', NULL, NULL);
+ test2 
+-------
+(1 row)
+
+CREATE OR REPLACE FUNCTION test3(a varchar, b varchar, c varchar)
+RETURNS void AS $$
+CLUSTER 'testcluster';
+RUN ON 0;
+SELECT * FROM remote_func(a, c, b);
+$$ LANGUAGE plproxy;
+select * from test3(NULL,NULL, 'a');
+ test3 
+-------
+(1 row)
+
+select * from test3('a', NULL,NULL);
+ test3 
+-------
+(1 row)
+
index 6bf0f0064cdd5d1a7eb2ac059750df7aaf7df513..2d724c9b244f6fc116ee4d1ef3774aafe5da8370 100644 (file)
@@ -69,3 +69,53 @@ returns setof numbers_type as $x$
 $x$ language plproxy;
 
 select * from get_one();
+
+
+\c test_part
+create function remote_func(a varchar, b varchar, c varchar)
+returns void as $$
+begin
+    return;
+end;
+$$ language plpgsql;
+
+\c regression
+CREATE OR REPLACE FUNCTION test1(x integer, a varchar, b varchar, c varchar)
+RETURNS void AS $$
+CLUSTER 'testcluster';
+RUN ON 0;
+SELECT * FROM remote_func(a, b, c);
+$$ LANGUAGE plproxy;
+
+select * from test1(1, 'a', NULL,NULL);
+select * from test1(1, NULL, NULL,NULL);
+
+CREATE OR REPLACE FUNCTION test2(a varchar, b varchar, c varchar)
+RETURNS void AS $$
+CLUSTER 'testcluster';
+RUN ON 0;
+SELECT * FROM remote_func(a, b, c);
+$$ LANGUAGE plproxy;
+
+select * from test2(NULL, NULL, NULL);
+select * from test2('a', NULL, NULL);
+
+
+CREATE OR REPLACE FUNCTION test3(a varchar, b varchar, c varchar)
+RETURNS void AS $$
+CLUSTER 'testcluster';
+RUN ON 0;
+SELECT * FROM remote_func(a, c, b);
+$$ LANGUAGE plproxy;
+
+select * from test3(NULL,NULL, 'a');
+select * from test3('a', NULL,NULL);
+
+
+
+
+
+
+
+
+
index 3e937ff405a6e556c9c3da73fa1f4860ed8290d9..c62c28537cefa2966f1ab2fb122130f0f766005b 100644 (file)
@@ -774,15 +774,15 @@ plproxy_exec(ProxyFunction *func, FunctionCallInfo fcinfo)
        gotbin = 0;
        for (i = 0; i < func->remote_sql->arg_count; i++)
        {
+               int idx = func->remote_sql->arg_lookup[i];
                plengths[i] = 0;
                pformats[i] = 0;
-               if (PG_ARGISNULL(i))
+               if (PG_ARGISNULL(idx))
                {
                        values[i] = NULL;
                }
                else
                {
-                       int                     idx = func->remote_sql->arg_lookup[i];
                        bool            bin = cluster->config.disable_binary ? 0 : 1;
 
                        values[i] = plproxy_send_type(func->arg_types[idx],