fix(tdengine): fix SQL template errors

1. supports multi-table insert
2. supports constructing subtable names by mixed prefixes and placeholders
This commit is contained in:
firest 2023-07-13 04:44:48 +00:00
parent 8ebe099653
commit fef5087c41
1 changed files with 11 additions and 27 deletions

View File

@ -124,7 +124,7 @@ on_query(InstanceId, {query, SQL}, State) ->
on_query(InstanceId, {Key, Data}, #{insert_tokens := InsertTksMap} = State) ->
case maps:find(Key, InsertTksMap) of
{ok, Tokens} when is_map(Data) ->
SQL = emqx_placeholder:proc_sql_param_str(Tokens, Data),
SQL = emqx_placeholder:proc_tmpl(Tokens, Data),
do_query(InstanceId, SQL, State);
_ ->
{error, {unrecoverable_error, invalid_request}}
@ -209,31 +209,16 @@ execute(Conn, Query, Opts) ->
tdengine:insert(Conn, Query, Opts).
do_batch_insert(Conn, Tokens, BatchReqs, Opts) ->
Queries = aggregate_query(Tokens, BatchReqs),
SQL = maps:fold(
fun(InsertPart, Values, Acc) ->
lists:foldl(
fun(ValuePart, IAcc) ->
<<IAcc/binary, " ", ValuePart/binary>>
end,
<<Acc/binary, " ", InsertPart/binary, " VALUES">>,
Values
)
end,
<<"INSERT INTO">>,
Queries
),
SQL = aggregate_query(Tokens, BatchReqs, <<"INSERT INTO">>),
execute(Conn, SQL, Opts).
aggregate_query({InsertPartTks, ParamsPartTks}, BatchReqs) ->
aggregate_query(BatchTks, BatchReqs, Acc) ->
lists:foldl(
fun({_, Data}, Acc) ->
InsertPart = emqx_placeholder:proc_sql_param_str(InsertPartTks, Data),
ParamsPart = emqx_placeholder:proc_sql_param_str(ParamsPartTks, Data),
Values = maps:get(InsertPart, Acc, []),
maps:put(InsertPart, [ParamsPart | Values], Acc)
fun({_, Data}, InAcc) ->
InsertPart = emqx_placeholder:proc_tmpl(BatchTks, Data),
<<InAcc/binary, " ", InsertPart/binary>>
end,
#{},
Acc,
BatchReqs
).
@ -260,13 +245,12 @@ parse_batch_prepare_sql([{Key, H} | T], InsertTksMap, BatchTksMap) ->
InsertTks = emqx_placeholder:preproc_tmpl(H),
H1 = string:trim(H, trailing, ";"),
case split_insert_sql(H1) of
[_InsertStr, InsertPart, _ValuesStr, ParamsPart] ->
InsertPartTks = emqx_placeholder:preproc_tmpl(InsertPart),
ParamsPartTks = emqx_placeholder:preproc_tmpl(ParamsPart),
[_InsertPart, BatchDesc] ->
BatchTks = emqx_placeholder:preproc_tmpl(BatchDesc),
parse_batch_prepare_sql(
T,
InsertTksMap#{Key => InsertTks},
BatchTksMap#{Key => {InsertPartTks, ParamsPartTks}}
BatchTksMap#{Key => BatchTks}
);
Result ->
?SLOG(error, #{msg => "split sql failed", sql => H, result => Result}),
@ -299,7 +283,7 @@ split_insert_sql(SQL0) ->
{true, E1}
end
end,
re:split(SQL, "(?i)(insert into)|(?i)(values)")
re:split(SQL, "(?i)(insert into)")
).
formalize_sql(Input) ->