From 01509c46d93df7bf3ad2429ca513cf9cf18855ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Tersl=C3=B8v=20Forsberg?= Date: Wed, 11 Nov 2015 15:30:43 +0100 Subject: [PATCH 1/3] Remove param code duplication Newly introduced params clauses for calls are already handled by expr/2 line 405-407, so eliminate unnecessary code duplication --- src/sqerl.erl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sqerl.erl b/src/sqerl.erl index eaf074d..56920dd 100644 --- a/src/sqerl.erl +++ b/src/sqerl.erl @@ -474,10 +474,8 @@ expr2(undefined, _Safe) -> <<"NULL">>; expr2(Expr, _Safe) when is_atom(Expr) -> convert(Expr); expr2(Expr, Safe) -> expr(Expr, Safe). -param({call, FuncName, []}) -> - [convert(FuncName), <<"()">>]; -param({call, FuncName, Params}) -> - [convert(FuncName), $(, make_list(Params, fun param/1), $)]; +param({call, _FuncName, _Params} = Call) -> + expr(Call, undefined); param({Key, Value}) when is_atom(Key) -> [convert(Key), <<" := ">>, encode(Value)]; param(Key) when is_atom(Key) -> From 6e2689454fa9c56edae50881b345469b6009f724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Tersl=C3=B8v=20Forsberg?= Date: Wed, 11 Nov 2015 15:38:55 +0100 Subject: [PATCH 2/3] Expr-parse function calls in positional arguments ... rather than trying to encode them. --- src/sqerl.erl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sqerl.erl b/src/sqerl.erl index 56920dd..37cde21 100644 --- a/src/sqerl.erl +++ b/src/sqerl.erl @@ -477,7 +477,12 @@ expr2(Expr, Safe) -> expr(Expr, Safe). param({call, _FuncName, _Params} = Call) -> expr(Call, undefined); param({Key, Value}) when is_atom(Key) -> - [convert(Key), <<" := ">>, encode(Value)]; + case Value of + {call, _FuncName, _Params} = Call -> + [convert(Key), <<" := ">>, expr(Call, undefined)]; + _ -> + [convert(Key), <<" := ">>, encode(Value)] + end; param(Key) when is_atom(Key) -> convert(Key); param(Value) -> From 9f058a76a16314f4f35f9fb991c427937a12459a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Tersl=C3=B8v=20Forsberg?= Date: Wed, 11 Nov 2015 15:44:08 +0100 Subject: [PATCH 3/3] Add test case for positional args in nested call --- test/sqerl_tests.erl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/sqerl_tests.erl b/test/sqerl_tests.erl index 19832ca..167df4b 100644 --- a/test/sqerl_tests.erl +++ b/test/sqerl_tests.erl @@ -210,6 +210,9 @@ safe_test_() -> {<<"SELECT name FROM search_people(age := 18)">>, ?_safe_test({select,name,{from,{call,search_people,[{age, 18}]}}}) }, + {<<"SELECT name FROM search_people(age := 18, area := postal_code(code := 12345))">>, + ?_safe_test({select,name,{from,{call,search_people,[{age,18},{area,{call,postal_code,[{code,12345}]}}]}}}) + }, {<<"SELECT * FROM foo JOIN bar ON (foo.bar_id = bar.id)">>, ?_safe_test({select,'*',{from,{foo,join,bar,{'foo.bar_id','=','bar.id'}}}}) },