From 89e3a1ec4a978ab9008305f98b43bd06b7993f75 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Fri, 11 Sep 2009 14:26:32 +0000 Subject: [PATCH] Fix argument value NULL check. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 62 +++++++++++++++++++++++++++++++++++++ sql/plproxy_select.sql | 50 ++++++++++++++++++++++++++++++ src/execute.c | 4 +-- 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/expected/plproxy_select.out b/expected/plproxy_select.out index 352c829..55f0e1b 100644 --- a/expected/plproxy_select.out +++ b/expected/plproxy_select.out @@ -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) + diff --git a/sql/plproxy_select.sql b/sql/plproxy_select.sql index 6bf0f00..2d724c9 100644 --- a/sql/plproxy_select.sql +++ b/sql/plproxy_select.sql @@ -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); + + + + + + + + + diff --git a/src/execute.c b/src/execute.c index 3e937ff..c62c285 100644 --- a/src/execute.c +++ b/src/execute.c @@ -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], -- 2.39.5