From 76695c965258b9d5477fd6f4baa92b3eaf092147 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Fri, 7 Jan 2022 14:44:56 +0800 Subject: [PATCH 01/11] test: update epgsql branch to test --- apps/emqx_connector/rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_connector/rebar.config b/apps/emqx_connector/rebar.config index 0ffae9f7c..bfc4149e7 100644 --- a/apps/emqx_connector/rebar.config +++ b/apps/emqx_connector/rebar.config @@ -7,7 +7,7 @@ {emqx, {path, "../emqx"}}, {eldap2, {git, "https://github.com/emqx/eldap2", {tag, "v0.2.2"}}}, {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.1"}}}, - {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7-emqx.1"}}}, + {epgsql, {git, "https://github.com/emqx/epgsql", {branch, "test"}}}, %% NOTE: mind poolboy version when updating mongodb-erlang version {mongodb, {git,"https://github.com/emqx/mongodb-erlang", {tag, "v3.0.11"}}}, %% NOTE: mind poolboy version when updating eredis_cluster version From 27910521358aa5efe7e3b3f371b6d2c71ac07fba Mon Sep 17 00:00:00 2001 From: zhouzb Date: Tue, 11 Jan 2022 09:39:56 +0800 Subject: [PATCH 02/11] fix: fix errors caused by concurrent parsing of sql --- .../src/simple_authn/emqx_authn_pgsql.erl | 8 +-- apps/emqx_authz/src/emqx_authz_postgresql.erl | 23 +++++--- .../src/emqx_connector_pgsql.erl | 57 +++++++++++++------ 3 files changed, 57 insertions(+), 31 deletions(-) diff --git a/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl b/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl index f431178bc..222dcc4db 100644 --- a/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl +++ b/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl @@ -80,7 +80,7 @@ create(#{query := Query0, placeholders => PlaceHolders, password_hash_algorithm => Algorithm, resource_id => ResourceId}, - case emqx_resource:create_local(ResourceId, emqx_connector_pgsql, Config) of + case emqx_resource:create_local(ResourceId, emqx_connector_pgsql, Config#{named_queries => #{ResourceId => Query}}) of {ok, already_created} -> {ok, State}; {ok, _} -> @@ -101,12 +101,11 @@ update(Config, State) -> authenticate(#{auth_method := _}, _) -> ignore; authenticate(#{password := Password} = Credential, - #{query := Query, - placeholders := PlaceHolders, + #{placeholders := PlaceHolders, resource_id := ResourceId, password_hash_algorithm := Algorithm}) -> Params = emqx_authn_utils:replace_placeholders(PlaceHolders, Credential), - case emqx_resource:query(ResourceId, {prepared_query, ResourceId, Query, Params}) of + case emqx_resource:query(ResourceId, {prepared_query, ResourceId, Params}) of {ok, _Columns, []} -> ignore; {ok, Columns, [Row | _]} -> NColumns = [Name || #column{name = Name} <- Columns], @@ -133,7 +132,6 @@ destroy(#{resource_id := ResourceId}) -> %% Internal functions %%------------------------------------------------------------------------------ -%% TODO: Support prepare parse_query(Query) -> case re:run(Query, ?RE_PLACEHOLDER, [global, {capture, all, binary}]) of {match, Captured} -> diff --git a/apps/emqx_authz/src/emqx_authz_postgresql.erl b/apps/emqx_authz/src/emqx_authz_postgresql.erl index d93d5447c..cfd58c53f 100644 --- a/apps/emqx_authz/src/emqx_authz_postgresql.erl +++ b/apps/emqx_authz/src/emqx_authz_postgresql.erl @@ -39,12 +39,19 @@ description() -> "AuthZ with Postgresql". -init(#{query := SQL} = Source) -> - case emqx_authz_utils:create_resource(emqx_connector_pgsql, Source) of - {error, Reason} -> error({load_config_error, Reason}); - {ok, Id} -> Source#{annotations => - #{id => Id, - query => parse_query(SQL)}} +init(#{query := SQL0} = Source) -> + {SQL, PlaceHolders} = parse_query(SQL0), + ResourceID = emqx_authz_utils:make_resource_id(emqx_connector_pgsql), + case emqx_resource:create_local( + ResourceID, + emqx_connector_pgsql, + Source#{named_queries => #{ResourceID => SQL}}) of + {ok, _} -> + Source#{annotations => + #{id => ResourceID, + placeholders => PlaceHolders}}; + {error, Reason} -> + error({load_config_error, Reason}) end. destroy(#{annotations := #{id := Id}}) -> @@ -70,10 +77,10 @@ parse_query(Sql) -> authorize(Client, PubSub, Topic, #{annotations := #{id := ResourceID, - query := {Query, Params} + placeholders := Placeholders } }) -> - case emqx_resource:query(ResourceID, {prepared_query, ResourceID, Query, replvar(Params, Client)}) of + case emqx_resource:query(ResourceID, {prepared_query, ResourceID, replvar(Placeholders, Client)}) of {ok, _Columns, []} -> nomatch; {ok, Columns, Rows} -> do_authorize(Client, PubSub, Topic, Columns, Rows); diff --git a/apps/emqx_connector/src/emqx_connector_pgsql.erl b/apps/emqx_connector/src/emqx_connector_pgsql.erl index 0dcddcc68..34f386282 100644 --- a/apps/emqx_connector/src/emqx_connector_pgsql.erl +++ b/apps/emqx_connector/src/emqx_connector_pgsql.erl @@ -17,6 +17,7 @@ -include_lib("typerefl/include/types.hrl"). -include_lib("emqx/include/logger.hrl"). +-include_lib("epgsql/include/epgsql.hrl"). -export([roots/0, fields/1]). @@ -33,7 +34,7 @@ -export([connect/1]). -export([ query/3 - , prepared_query/4 + , prepared_query/3 ]). -export([do_health_check/1]). @@ -44,12 +45,17 @@ roots() -> [{config, #{type => hoconsc:ref(?MODULE, config)}}]. fields(config) -> + [{named_queries, fun named_queries/1}] ++ emqx_connector_schema_lib:relational_db_fields() ++ emqx_connector_schema_lib:ssl_fields(). on_jsonify(#{server := Server}= Config) -> Config#{server => emqx_connector_schema_lib:ip_port_to_string(Server)}. +named_queries(type) -> map(); +named_queries(nullable) -> true; +named_queries(_) -> undefined. + %% =================================================================== on_start(InstId, #{server := {Host, Port}, database := DB, @@ -57,7 +63,7 @@ on_start(InstId, #{server := {Host, Port}, password := Password, auto_reconnect := AutoReconn, pool_size := PoolSize, - ssl := SSL } = Config) -> + ssl := SSL} = Config) -> ?SLOG(info, #{msg => "starting_postgresql_connector", connector => InstId, config => Config}), SslOpts = case maps:get(enable, SSL) of @@ -74,7 +80,8 @@ on_start(InstId, #{server := {Host, Port}, {password, Password}, {database, DB}, {auto_reconnect, reconn_interval(AutoReconn)}, - {pool_size, PoolSize}], + {pool_size, PoolSize}, + {named_queries, maps:to_list(maps:get(named_queries, Config, #{}))}], PoolName = emqx_plugin_libs_pool:pool_name(InstId), _ = emqx_plugin_libs_pool:start_pool(PoolName, ?MODULE, Options ++ SslOpts), {ok, #{poolname => PoolName}}. @@ -84,20 +91,17 @@ on_stop(InstId, #{poolname := PoolName}) -> connector => InstId}), emqx_plugin_libs_pool:stop_pool(PoolName). -on_query(InstId, QueryParams, AfterQuery, #{poolname := PoolName} = State) -> - {Command, Args} = case QueryParams of - {query, SQL} -> {query, [SQL, []]}; - {query, SQL, Params} -> {query, [SQL, Params]}; - {prepared_query, Name, SQL} -> {prepared_query, [Name, SQL, []]}; - {prepared_query, Name, SQL, Params} -> {prepared_query, [Name, SQL, Params]} - end, - ?TRACE("QUERY", "postgresql_connector_received", - #{connector => InstId, command => Command, args => Args, state => State}), - case Result = ecpool:pick_and_do(PoolName, {?MODULE, Command, Args}, no_handover) of +on_query(InstId, {Type, NameOrSQL}, AfterQuery, #{poolname := _PoolName} = State) -> + on_query(InstId, {Type, NameOrSQL, []}, AfterQuery, State); + +on_query(InstId, {Type, NameOrSQL, Params}, AfterQuery, #{poolname := PoolName} = State) -> + ?SLOG(debug, #{msg => "postgresql connector received sql query", + connector => InstId, sql => NameOrSQL, state => State}), + case Result = ecpool:pick_and_do(PoolName, {?MODULE, Type, [NameOrSQL, Params]}, no_handover) of {error, Reason} -> ?SLOG(error, #{ - msg => "postgresql_connector_do_sql_query_failed", - connector => InstId, sql => SQL, reason => Reason}), + msg => "postgresql connector do sql query failed", + connector => InstId, sql => NameOrSQL, reason => Reason}), emqx_resource:query_failed(AfterQuery); _ -> emqx_resource:query_success(AfterQuery) @@ -118,13 +122,30 @@ connect(Opts) -> Host = proplists:get_value(host, Opts), Username = proplists:get_value(username, Opts), Password = proplists:get_value(password, Opts), - epgsql:connect(Host, Username, Password, conn_opts(Opts)). + NamedQueries = proplists:get_value(named_queries, Opts), + case epgsql:connect(Host, Username, Password, conn_opts(Opts)) of + {ok, Conn} -> + parse(Conn, NamedQueries), + {ok, Conn}; + {error, Reason} -> + {error, Reason} + end. query(Conn, SQL, Params) -> epgsql:equery(Conn, SQL, Params). -prepared_query(Conn, Name, SQL, Params) -> - epgsql:prepared_query2(Conn, Name, SQL, Params). +prepared_query(Conn, Name, Params) -> + epgsql:prepared_query2(Conn, Name, Params). + +parse(_Conn, []) -> + ok; +parse(Conn, [{Name, Query} | More]) -> + case epgsql:parse2(Conn, Name, Query, []) of + {ok, _Statement} -> + parse(Conn, More); + Other -> + Other + end. conn_opts(Opts) -> conn_opts(Opts, []). From ac631110cb1d1f455a4e592e9c1dc8a1701acd7b Mon Sep 17 00:00:00 2001 From: zhouzb Date: Tue, 11 Jan 2022 10:05:11 +0800 Subject: [PATCH 03/11] chore: remove useless field --- apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl b/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl index 222dcc4db..6589fc8eb 100644 --- a/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl +++ b/apps/emqx_authn/src/simple_authn/emqx_authn_pgsql.erl @@ -76,8 +76,7 @@ create(#{query := Query0, ok = emqx_authn_password_hashing:init(Algorithm), {Query, PlaceHolders} = parse_query(Query0), ResourceId = emqx_authn_utils:make_resource_id(?MODULE), - State = #{query => Query, - placeholders => PlaceHolders, + State = #{placeholders => PlaceHolders, password_hash_algorithm => Algorithm, resource_id => ResourceId}, case emqx_resource:create_local(ResourceId, emqx_connector_pgsql, Config#{named_queries => #{ResourceId => Query}}) of From 2eb73462296f6a5c05bceca8676663a906160290 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Wed, 12 Jan 2022 13:49:26 +0800 Subject: [PATCH 04/11] chore: update tag of epgsql --- apps/emqx_connector/rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_connector/rebar.config b/apps/emqx_connector/rebar.config index bfc4149e7..48f91b9bb 100644 --- a/apps/emqx_connector/rebar.config +++ b/apps/emqx_connector/rebar.config @@ -7,7 +7,7 @@ {emqx, {path, "../emqx"}}, {eldap2, {git, "https://github.com/emqx/eldap2", {tag, "v0.2.2"}}}, {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.1"}}}, - {epgsql, {git, "https://github.com/emqx/epgsql", {branch, "test"}}}, + {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7-emqx.2"}}}, %% NOTE: mind poolboy version when updating mongodb-erlang version {mongodb, {git,"https://github.com/emqx/mongodb-erlang", {tag, "v3.0.11"}}}, %% NOTE: mind poolboy version when updating eredis_cluster version From 559a23c50f2effdcbd505eadab1e110c6e928a10 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Thu, 13 Jan 2022 10:15:12 +0800 Subject: [PATCH 05/11] chore: update tag of epgsql --- apps/emqx_connector/rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_connector/rebar.config b/apps/emqx_connector/rebar.config index 48f91b9bb..ae2455783 100644 --- a/apps/emqx_connector/rebar.config +++ b/apps/emqx_connector/rebar.config @@ -7,7 +7,7 @@ {emqx, {path, "../emqx"}}, {eldap2, {git, "https://github.com/emqx/eldap2", {tag, "v0.2.2"}}}, {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.1"}}}, - {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7-emqx.2"}}}, + {epgsql, {git, "https://github.com/emqx/epgsql", {branch, "4.7.0-emqx.2"}}}, %% NOTE: mind poolboy version when updating mongodb-erlang version {mongodb, {git,"https://github.com/emqx/mongodb-erlang", {tag, "v3.0.11"}}}, %% NOTE: mind poolboy version when updating eredis_cluster version From a4f2a9c51d26ed42f8bfc6e4fac2ca1e799d92ab Mon Sep 17 00:00:00 2001 From: zhouzb Date: Thu, 13 Jan 2022 10:40:22 +0800 Subject: [PATCH 06/11] fix: fix dependency of epgsql --- apps/emqx_connector/rebar.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/emqx_connector/rebar.config b/apps/emqx_connector/rebar.config index ae2455783..11cc95ed1 100644 --- a/apps/emqx_connector/rebar.config +++ b/apps/emqx_connector/rebar.config @@ -7,7 +7,7 @@ {emqx, {path, "../emqx"}}, {eldap2, {git, "https://github.com/emqx/eldap2", {tag, "v0.2.2"}}}, {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.1"}}}, - {epgsql, {git, "https://github.com/emqx/epgsql", {branch, "4.7.0-emqx.2"}}}, + {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7.0-emqx.2"}}}, %% NOTE: mind poolboy version when updating mongodb-erlang version {mongodb, {git,"https://github.com/emqx/mongodb-erlang", {tag, "v3.0.11"}}}, %% NOTE: mind poolboy version when updating eredis_cluster version From 452f6e766a59874840ff538a55c07545b96441a7 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Thu, 13 Jan 2022 11:15:08 +0800 Subject: [PATCH 07/11] fix: return error when parse failed --- apps/emqx_connector/src/emqx_connector_pgsql.erl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/emqx_connector/src/emqx_connector_pgsql.erl b/apps/emqx_connector/src/emqx_connector_pgsql.erl index 34f386282..90d1c207e 100644 --- a/apps/emqx_connector/src/emqx_connector_pgsql.erl +++ b/apps/emqx_connector/src/emqx_connector_pgsql.erl @@ -125,8 +125,10 @@ connect(Opts) -> NamedQueries = proplists:get_value(named_queries, Opts), case epgsql:connect(Host, Username, Password, conn_opts(Opts)) of {ok, Conn} -> - parse(Conn, NamedQueries), - {ok, Conn}; + case parse(Conn, NamedQueries) of + ok -> {ok, Conn}; + {error, Reason} -> {error, Reason} + end; {error, Reason} -> {error, Reason} end. From e2676bcbd8d62b14e0c22cc7513cbdf292f4d012 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Thu, 13 Jan 2022 11:39:48 +0800 Subject: [PATCH 08/11] fix: fix dep of epgsql --- apps/emqx_connector/rebar.config | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/emqx_connector/rebar.config b/apps/emqx_connector/rebar.config index 11cc95ed1..48f91b9bb 100644 --- a/apps/emqx_connector/rebar.config +++ b/apps/emqx_connector/rebar.config @@ -7,7 +7,7 @@ {emqx, {path, "../emqx"}}, {eldap2, {git, "https://github.com/emqx/eldap2", {tag, "v0.2.2"}}}, {mysql, {git, "https://github.com/emqx/mysql-otp", {tag, "1.7.1"}}}, - {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7.0-emqx.2"}}}, + {epgsql, {git, "https://github.com/emqx/epgsql", {tag, "4.7-emqx.2"}}}, %% NOTE: mind poolboy version when updating mongodb-erlang version {mongodb, {git,"https://github.com/emqx/mongodb-erlang", {tag, "v3.0.11"}}}, %% NOTE: mind poolboy version when updating eredis_cluster version diff --git a/mix.exs b/mix.exs index ca66f0c6d..aa0aa9d31 100644 --- a/mix.exs +++ b/mix.exs @@ -73,7 +73,7 @@ defmodule EMQXUmbrella.MixProject do # in conflict by ehttpc and emqtt {:gun, github: "emqx/gun", tag: "1.3.6", override: true}, # in conflict by emqx_connectior and system_monitor - {:epgsql, github: "emqx/epgsql", tag: "4.7-emqx.1", override: true}, + {:epgsql, github: "emqx/epgsql", tag: "4.7-emqx.2", override: true}, # in conflict by mongodb and eredis_cluster {:poolboy, github: "emqx/poolboy", tag: "1.5.2", override: true}, # in conflict by emqx and observer_cli From 683d1c3412ce24756e60af9c00a9b3c62289de60 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Thu, 13 Jan 2022 14:27:36 +0800 Subject: [PATCH 09/11] test: fix test cases --- apps/emqx_authn/test/emqx_authn_pgsql_SUITE.erl | 6 +++--- apps/emqx_authn/test/emqx_authn_pgsql_tls_SUITE.erl | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/emqx_authn/test/emqx_authn_pgsql_SUITE.erl b/apps/emqx_authn/test/emqx_authn_pgsql_SUITE.erl index bfccaf128..a2c95314d 100644 --- a/apps/emqx_authn/test/emqx_authn_pgsql_SUITE.erl +++ b/apps/emqx_authn/test/emqx_authn_pgsql_SUITE.erl @@ -31,10 +31,10 @@ -define(PATH, [authentication]). all() -> - [{group, require_seeds}, t_create, t_create_invalid, t_parse_query]. + [{group, require_seeds}, t_create_invalid, t_parse_query]. groups() -> - [{require_seeds, [], [t_authenticate, t_update, t_destroy, t_is_superuser]}]. + [{require_seeds, [], [t_create, t_authenticate, t_update, t_destroy, t_is_superuser]}]. init_per_testcase(_, Config) -> {ok, _} = emqx_cluster_rpc:start_link(node(), emqx_cluster_rpc, 1000), @@ -171,7 +171,7 @@ t_update(_Config) -> IncorrectConfig = CorrectConfig#{ query => <<"SELECT password_hash, salt, is_superuser_str as is_superuser - FROM wrong_table where username = ${username} LIMIT 1">>}, + FROM users where username = ${username} LIMIT 0">>}, {ok, _} = emqx:update_config( ?PATH, diff --git a/apps/emqx_authn/test/emqx_authn_pgsql_tls_SUITE.erl b/apps/emqx_authn/test/emqx_authn_pgsql_tls_SUITE.erl index 51a1ce8dd..0225ed06f 100644 --- a/apps/emqx_authn/test/emqx_authn_pgsql_tls_SUITE.erl +++ b/apps/emqx_authn/test/emqx_authn_pgsql_tls_SUITE.erl @@ -125,8 +125,7 @@ raw_pgsql_auth_config(SpecificSSLOpts) -> username => <<"root">>, password => <<"public">>, - query => <<"SELECT password_hash, salt, is_superuser_str as is_superuser - FROM users where username = ${username} LIMIT 1">>, + query => <<"SELECT 1">>, server => pgsql_server(), ssl => maps:merge(SSLOpts, SpecificSSLOpts) }. From 5e2bc7853f3233fecc8bee955d00acf00336b97e Mon Sep 17 00:00:00 2001 From: zhouzb Date: Thu, 13 Jan 2022 16:53:47 +0800 Subject: [PATCH 10/11] test: fix test cases for pgsql authz --- apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl | 2 +- apps/emqx_authz/test/emqx_authz_test_lib.erl | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl b/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl index 6ececd3f8..794f5a8cf 100644 --- a/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl +++ b/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl @@ -167,7 +167,7 @@ t_pgsql_error(_Config) -> listener => {tcp, default} }, - ok = setup_config( + {error, _} = setup_config( #{<<"query">> => <<"SOME INVALID STATEMENT">>}), ok = emqx_authz_test_lib:test_samples( diff --git a/apps/emqx_authz/test/emqx_authz_test_lib.erl b/apps/emqx_authz/test/emqx_authz_test_lib.erl index bacbbe10a..b7de5c3da 100644 --- a/apps/emqx_authz/test/emqx_authz_test_lib.erl +++ b/apps/emqx_authz/test/emqx_authz_test_lib.erl @@ -40,8 +40,10 @@ reset_authorizers(Nomatch, ChacheEnabled) -> setup_config(BaseConfig, SpecialParams) -> Config = maps:merge(BaseConfig, SpecialParams), - {ok, _} = emqx_authz:update(?CMD_REPLACE, [Config]), - ok. + case emqx_authz:update(?CMD_REPLACE, [Config]) of + {ok, _} -> ok; + {error, Reason} -> {error, Reason} + end. is_tcp_server_available(Host, Port) -> case gen_tcp:connect(Host, Port, [], ?DEFAULT_CHECK_AVAIL_TIMEOUT) of From c59d9798a40e1acd6a249d99047ab2e5fcf2c610 Mon Sep 17 00:00:00 2001 From: zhouzb Date: Fri, 14 Jan 2022 09:26:15 +0800 Subject: [PATCH 11/11] test: fix test case --- apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl b/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl index 794f5a8cf..45745326d 100644 --- a/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl +++ b/apps/emqx_authz/test/emqx_authz_postgresql_SUITE.erl @@ -167,8 +167,9 @@ t_pgsql_error(_Config) -> listener => {tcp, default} }, - {error, _} = setup_config( - #{<<"query">> => <<"SOME INVALID STATEMENT">>}), + ok = setup_config( + #{<<"query">> => <<"SELECT permission, action, topic " + "FROM acl WHERE clientid = ${username}">>}), ok = emqx_authz_test_lib:test_samples( ClientInfo,