mirror of
https://github.com/processone/ejabberd.git
synced 2024-12-22 17:28:25 +01:00
Raise an error when there are no fields to set in ?SQL_UPSERT
This commit is contained in:
parent
e21f25f5b9
commit
9a049442ff
@ -60,9 +60,9 @@ transform(Form) ->
|
|||||||
case erl_syntax:type(Arg) of
|
case erl_syntax:type(Arg) of
|
||||||
string ->
|
string ->
|
||||||
S = erl_syntax:string_value(Arg),
|
S = erl_syntax:string_value(Arg),
|
||||||
ParseRes =
|
Pos = erl_syntax:get_pos(Arg),
|
||||||
parse(S, erl_syntax:get_pos(Arg)),
|
ParseRes = parse(S, Pos),
|
||||||
make_sql_query(ParseRes);
|
set_pos(make_sql_query(ParseRes), Pos);
|
||||||
_ ->
|
_ ->
|
||||||
throw({error, erl_syntax:get_pos(Form),
|
throw({error, erl_syntax:get_pos(Form),
|
||||||
"?SQL argument must be "
|
"?SQL argument must be "
|
||||||
@ -82,7 +82,10 @@ transform(Form) ->
|
|||||||
ParseRes =
|
ParseRes =
|
||||||
parse_upsert(
|
parse_upsert(
|
||||||
erl_syntax:list_elements(FieldsArg)),
|
erl_syntax:list_elements(FieldsArg)),
|
||||||
make_sql_upsert(Table, ParseRes);
|
Pos = erl_syntax:get_pos(Form),
|
||||||
|
set_pos(
|
||||||
|
make_sql_upsert(Table, ParseRes, Pos),
|
||||||
|
Pos);
|
||||||
_ ->
|
_ ->
|
||||||
throw({error, erl_syntax:get_pos(Form),
|
throw({error, erl_syntax:get_pos(Form),
|
||||||
"?SQL_UPSERT arguments must be "
|
"?SQL_UPSERT arguments must be "
|
||||||
@ -322,7 +325,8 @@ parse_upsert_field1([C | S], Acc, ParamPos, Loc) ->
|
|||||||
parse_upsert_field1(S, [C | Acc], ParamPos, Loc).
|
parse_upsert_field1(S, [C | Acc], ParamPos, Loc).
|
||||||
|
|
||||||
|
|
||||||
make_sql_upsert(Table, ParseRes) ->
|
make_sql_upsert(Table, ParseRes, Pos) ->
|
||||||
|
check_upsert(ParseRes, Pos),
|
||||||
erl_syntax:fun_expr(
|
erl_syntax:fun_expr(
|
||||||
[erl_syntax:clause(
|
[erl_syntax:clause(
|
||||||
[erl_syntax:atom(pgsql), erl_syntax:variable("__Version")],
|
[erl_syntax:atom(pgsql), erl_syntax:variable("__Version")],
|
||||||
@ -454,6 +458,22 @@ make_sql_upsert_pgsql901(Table, ParseRes) ->
|
|||||||
[Upsert]).
|
[Upsert]).
|
||||||
|
|
||||||
|
|
||||||
|
check_upsert(ParseRes, Pos) ->
|
||||||
|
Set =
|
||||||
|
lists:filter(
|
||||||
|
fun({_Field, Match, _ST}) ->
|
||||||
|
not Match
|
||||||
|
end, ParseRes),
|
||||||
|
case Set of
|
||||||
|
[] ->
|
||||||
|
throw({error, Pos,
|
||||||
|
"No ?SQL_UPSERT fields to set, use INSERT instead"});
|
||||||
|
_ ->
|
||||||
|
ok
|
||||||
|
end,
|
||||||
|
ok.
|
||||||
|
|
||||||
|
|
||||||
concat_states(States) ->
|
concat_states(States) ->
|
||||||
lists:foldr(
|
lists:foldr(
|
||||||
fun(ST11, ST2) ->
|
fun(ST11, ST2) ->
|
||||||
@ -507,9 +527,18 @@ resolve_vars(ST1, ST2) ->
|
|||||||
ST1#state{params = NewParams, 'query' = NewQuery}.
|
ST1#state{params = NewParams, 'query' = NewQuery}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
join_states([], _Sep) ->
|
join_states([], _Sep) ->
|
||||||
#state{};
|
#state{};
|
||||||
join_states([H | T], Sep) ->
|
join_states([H | T], Sep) ->
|
||||||
J = [[H] | [[#state{'query' = [{str, Sep}]}, X] || X <- T]],
|
J = [[H] | [[#state{'query' = [{str, Sep}]}, X] || X <- T]],
|
||||||
concat_states(lists:append(J)).
|
concat_states(lists:append(J)).
|
||||||
|
|
||||||
|
|
||||||
|
set_pos(Tree, Pos) ->
|
||||||
|
erl_syntax_lib:map(
|
||||||
|
fun(Node) ->
|
||||||
|
case erl_syntax:get_pos(Node) of
|
||||||
|
0 -> erl_syntax:set_pos(Node, Pos);
|
||||||
|
_ -> Node
|
||||||
|
end
|
||||||
|
end, Tree).
|
||||||
|
Loading…
Reference in New Issue
Block a user