diff --git a/mysql-test/r/mysqld--help-notwin.result b/mysql-test/r/mysqld--help-notwin.result index 82f33fea8b8b..55180a7717a2 100644 --- a/mysql-test/r/mysqld--help-notwin.result +++ b/mysql-test/r/mysqld--help-notwin.result @@ -305,6 +305,9 @@ The following options may be given as the first argument: proxy user mapping should be done according to GRANT PROXY privilege definition. -r, --chroot=name Chroot mysqld daemon during startup. + --client-attribute-names[=name] + List of supported query/connection attributes to use for + client_attributes (default: caller,async_id). --collation-server=name Set the default collation. --column-stats-control=name @@ -2668,6 +2671,7 @@ character-set-server utf8mb4 character-sets-dir MYSQL_CHARSETSDIR/ check-proxy-users FALSE chroot (No default value) +client-attribute-names caller,async_id collation-server utf8mb4_0900_ai_ci column-stats-control OFF_HARD commit-consensus-error-action ROLLBACK_TRXS_IN_GROUP diff --git a/mysql-test/suite/perfschema/r/client_attrs.result b/mysql-test/suite/perfschema/r/client_attrs.result index 6c821c108b44..70a3df5593ac 100644 --- a/mysql-test/suite/perfschema/r/client_attrs.result +++ b/mysql-test/suite/perfschema/r/client_attrs.result @@ -21,6 +21,7 @@ d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bc d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} # # Verify with query attrs caller = qa_test1 +# original_caller QA = oc_qa_test1 (not allowed yet) # select 1; 1 @@ -31,7 +32,23 @@ d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} # +# Verify with query attrs caller = qa_test1 +# original_caller QA = oc_qa_test1 (allowed) +# +set @saved_client_attribute_names=@@GLOBAL.client_attribute_names; +set global client_attribute_names='caller,original_caller,async_id'; +select 1; +1 +1 +select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; +digest count_star client_id client_attributes +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} +# # Verify with query attrs caller = qa_test1 and async id = 12345 +# query attrs original_caller = oc_qa_test1 # select 1; 1 @@ -39,7 +56,8 @@ select 1; select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; digest count_star client_id client_attributes d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 647e3f32d8d8ab6fff0dda94443bb610 {'caller' : 'qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 70e7785b1e52423f531f3899d707055c {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} create user user@localhost identified by 'su'; @@ -47,17 +65,19 @@ grant all on *.* to user@localhost with grant option; use performance_schema; # # Verify with conn attrs caller = ca_test2 and async_id = 56789 +# and original_caller CA = oc_ca_test2 # select 1; 1 1 select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; digest count_star client_id client_attributes +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 23af960d50f4082d1693fec287ca38d5 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 647e3f32d8d8ab6fff0dda94443bb610 {'caller' : 'qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 70e7785b1e52423f531f3899d707055c {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 d1226657f4c383150755d71bb4251f55 {'caller' : 'ca_test2', 'async_id' : '56789'} # # Verify with query attrs overriding async_id = 12345 # @@ -66,12 +86,13 @@ select 1; 1 select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; digest count_star client_id client_attributes +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 23af960d50f4082d1693fec287ca38d5 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 2de7f57d90f10431496a2001ca164d6e {'caller' : 'ca_test2', 'async_id' : '12345'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 647e3f32d8d8ab6fff0dda94443bb610 {'caller' : 'qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 3b5d439992eb9afdf758682481730bf7 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 70e7785b1e52423f531f3899d707055c {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 d1226657f4c383150755d71bb4251f55 {'caller' : 'ca_test2', 'async_id' : '56789'} # # Verify with query attrs overriding caller = qa_test3 # @@ -80,13 +101,31 @@ select 1; 1 select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; digest count_star client_id client_attributes +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 23af960d50f4082d1693fec287ca38d5 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 3b5d439992eb9afdf758682481730bf7 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 70e7785b1e52423f531f3899d707055c {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 e0e39521171bfe83b6d120922ecbdec7 {'caller' : 'qa_test3', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} +# +# Verify with query attrs overriding original caller = oc_qa_test3 +# +select 1; +1 +1 +select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; +digest count_star client_id client_attributes +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 00ba20da7a5e884afeebf2b1537ddf1e {'caller' : 'ca_test2', 'original_caller' : 'oc_qa_test3', 'async_id' : '56789'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 23af960d50f4082d1693fec287ca38d5 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 2de7f57d90f10431496a2001ca164d6e {'caller' : 'ca_test2', 'async_id' : '12345'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 5c25d07da9d036c157b55e9ce8c564c7 {'caller' : 'qa_test3', 'async_id' : '56789'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 647e3f32d8d8ab6fff0dda94443bb610 {'caller' : 'qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 3b5d439992eb9afdf758682481730bf7 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 70e7785b1e52423f531f3899d707055c {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 d1226657f4c383150755d71bb4251f55 {'caller' : 'ca_test2', 'async_id' : '56789'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 e0e39521171bfe83b6d120922ecbdec7 {'caller' : 'qa_test3', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} # # Verify with just conn attrs again # @@ -95,13 +134,15 @@ select 1; 1 select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; digest count_star client_id client_attributes +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 00ba20da7a5e884afeebf2b1537ddf1e {'caller' : 'ca_test2', 'original_caller' : 'oc_qa_test3', 'async_id' : '56789'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 2 23af960d50f4082d1693fec287ca38d5 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 28b1c55c76dad7360f14f3d9f1823864 {'caller' : 'qa_test1'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 2de7f57d90f10431496a2001ca164d6e {'caller' : 'ca_test2', 'async_id' : '12345'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 5c25d07da9d036c157b55e9ce8c564c7 {'caller' : 'qa_test3', 'async_id' : '56789'} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 647e3f32d8d8ab6fff0dda94443bb610 {'caller' : 'qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 3b5d439992eb9afdf758682481730bf7 {'caller' : 'ca_test2', 'original_caller' : 'oc_ca_test2', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 70e7785b1e52423f531f3899d707055c {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1', 'async_id' : '12345'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 7c15419e499cc3fb461c2f7563d152da {'caller' : 'qa_test1', 'original_caller' : 'oc_qa_test1'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 92c0acc6261bcb114a857e42acb41812 {'async_id' : '12345'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 2 d1226657f4c383150755d71bb4251f55 {'caller' : 'ca_test2', 'async_id' : '56789'} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 e0e39521171bfe83b6d120922ecbdec7 {'caller' : 'qa_test3', 'original_caller' : 'oc_ca_test2', 'async_id' : '56789'} use performance_schema; truncate table client_attributes; select * from client_attributes; @@ -118,7 +159,8 @@ select 1; select 2; 2 select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; digest count_star client_id client_attributes -d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 2 16d36a0c20053a85f98470b2ab3e061f {'caller' : 'qa_multiquery'} d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 1 99914b932bd37a50b983c5e7c90ae93b {} +d1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae 2 c7e8290cc1f481a21ff284f6ed08a538 {'caller' : 'qa_multiquery', 'original_caller' : 'oc_multiquery'} +set global client_attribute_names=@saved_client_attribute_names; drop user user@localhost; set global performance_schema_esms_by_all = DEFAULT; diff --git a/mysql-test/suite/perfschema/t/client_attrs.test b/mysql-test/suite/perfschema/t/client_attrs.test index 477fe0a7bec9..47b8261ea552 100644 --- a/mysql-test/suite/perfschema/t/client_attrs.test +++ b/mysql-test/suite/perfschema/t/client_attrs.test @@ -20,15 +20,28 @@ select s.digest, s.count_star, c.client_id, c.client_attributes from events_stat --echo # --echo # Verify with query attrs caller = qa_test1 +--echo # original_caller QA = oc_qa_test1 (not allowed yet) --echo # query_attrs_reset; query_attrs_add caller qa_test1; +query_attrs_add original_caller oc_qa_test1; +select 1; + +select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; + +--echo # +--echo # Verify with query attrs caller = qa_test1 +--echo # original_caller QA = oc_qa_test1 (allowed) +--echo # +set @saved_client_attribute_names=@@GLOBAL.client_attribute_names; +set global client_attribute_names='caller,original_caller,async_id'; select 1; select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; --echo # --echo # Verify with query attrs caller = qa_test1 and async id = 12345 +--echo # query attrs original_caller = oc_qa_test1 --echo # query_attrs_add async_id 12345; select 1; @@ -41,6 +54,7 @@ grant all on *.* to user@localhost with grant option; connect (con1, localhost, user, su, test); conn_attrs_add caller ca_test2; +conn_attrs_add original_caller oc_ca_test2; conn_attrs_add async_id 56789; # change_user is needed just to set the correct connection attributes. change_user user,su,test; @@ -48,6 +62,7 @@ use performance_schema; --echo # --echo # Verify with conn attrs caller = ca_test2 and async_id = 56789 +--echo # and original_caller CA = oc_ca_test2 --echo # select 1; @@ -70,6 +85,15 @@ select 1; select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; +--echo # +--echo # Verify with query attrs overriding original caller = oc_qa_test3 +--echo # +query_attrs_reset; +query_attrs_add original_caller oc_qa_test3; +select 1; + +select s.digest, s.count_star, c.client_id, c.client_attributes from events_statements_summary_by_all s, client_attributes c where s.client_id = c.client_id and s.digest = 'd1b44b0c19af710b5a679907e284acd2ddc285201794bc69a2389d77baedddae' order by s.client_id; + --echo # --echo # Verify with just conn attrs again @@ -93,6 +117,7 @@ select * from client_attributes; --echo # Test multiquery cases --echo # query_attrs_add caller qa_multiquery; +query_attrs_add original_caller oc_multiquery; delimiter ||||; select 1; select 2; |||| @@ -103,6 +128,7 @@ select s.digest, s.count_star, c.client_id, c.client_attributes from events_stat connection default; # Cleanup +set global client_attribute_names=@saved_client_attribute_names; conn_attrs_reset; query_attrs_reset; drop user user@localhost; diff --git a/mysql-test/suite/sys_vars/r/client_attribute_names_basic.result b/mysql-test/suite/sys_vars/r/client_attribute_names_basic.result new file mode 100644 index 000000000000..619ac410fb8c --- /dev/null +++ b/mysql-test/suite/sys_vars/r/client_attribute_names_basic.result @@ -0,0 +1,35 @@ +Default value of client_attribute_names is caller,async_id +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +caller,async_id +SELECT @@session.client_attribute_names; +ERROR HY000: Variable 'client_attribute_names' is a GLOBAL variable +Expected error 'Variable is a GLOBAL variable' +client_attribute_names is a dynamic variable (change to a valid value) +set @@global.client_attribute_names = 'caller,original_caller,async_id'; +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +caller,original_caller,async_id +set @@global.client_attribute_names = 'caller,original_caller'; +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +caller,original_caller +set @@global.client_attribute_names = 'original_caller,async_id'; +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +original_caller,async_id +restore the default value +SET @@global.client_attribute_names = 'caller,async_id'; +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +caller,async_id +restart the server with non default value (caller,original_caller) +# restart: --client_attribute_names=caller,original_caller +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +caller,original_caller +restart the server with the default value (caller,async_id) +# restart: +SELECT @@global.client_attribute_names; +@@global.client_attribute_names +caller,async_id diff --git a/mysql-test/suite/sys_vars/r/sql_findings_control_basic.result b/mysql-test/suite/sys_vars/r/sql_findings_control_basic.result index f5426e7a78e3..a7030c9d86b9 100644 --- a/mysql-test/suite/sys_vars/r/sql_findings_control_basic.result +++ b/mysql-test/suite/sys_vars/r/sql_findings_control_basic.result @@ -16,12 +16,12 @@ SELECT @@global.sql_findings_control; @@global.sql_findings_control OFF_HARD restart the server with non default value (OFF_SOFT) -# restart +# restart: --sql_findings_control=off_soft SELECT @@global.sql_findings_control; @@global.sql_findings_control -OFF_HARD +OFF_SOFT restart the server with the default value (OFF_HARD) -# restart +# restart: SELECT @@global.sql_findings_control; @@global.sql_findings_control OFF_HARD diff --git a/mysql-test/suite/sys_vars/r/sql_maximum_duplicate_executions_basic.result b/mysql-test/suite/sys_vars/r/sql_maximum_duplicate_executions_basic.result index 23314d218f3e..f9a8283ec569 100644 --- a/mysql-test/suite/sys_vars/r/sql_maximum_duplicate_executions_basic.result +++ b/mysql-test/suite/sys_vars/r/sql_maximum_duplicate_executions_basic.result @@ -16,12 +16,12 @@ SELECT @@global.sql_maximum_duplicate_executions; @@global.sql_maximum_duplicate_executions 0 restart the server with non default value (5) -# restart +# restart: --sql_maximum_duplicate_executions=5 SELECT @@global.sql_maximum_duplicate_executions; @@global.sql_maximum_duplicate_executions -0 +5 restart the server with the default value (0) -# restart +# restart: SELECT @@global.sql_maximum_duplicate_executions; @@global.sql_maximum_duplicate_executions 0 diff --git a/mysql-test/suite/sys_vars/t/client_attribute_names_basic.test b/mysql-test/suite/sys_vars/t/client_attribute_names_basic.test new file mode 100644 index 000000000000..037e3a8df2b1 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/client_attribute_names_basic.test @@ -0,0 +1,48 @@ +-- source include/load_sysvars.inc + +#### +# Verify default value is OFF +#### +--echo Default value of client_attribute_names is caller,async_id +SELECT @@global.client_attribute_names; + +#### +# Verify that this is not a session variable +#### +--Error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.client_attribute_names; +--echo Expected error 'Variable is a GLOBAL variable' + +#### +## Verify that the variable is dynamic +#### +--echo client_attribute_names is a dynamic variable (change to a valid value) +set @@global.client_attribute_names = 'caller,original_caller,async_id'; +SELECT @@global.client_attribute_names; +set @@global.client_attribute_names = 'caller,original_caller'; +SELECT @@global.client_attribute_names; +set @@global.client_attribute_names = 'original_caller,async_id'; +SELECT @@global.client_attribute_names; + +#### +## Restore the default value +#### +--echo restore the default value +SET @@global.client_attribute_names = 'caller,async_id'; +SELECT @@global.client_attribute_names; + +#### +## Restart the server with a non default value of the variable +#### +--echo restart the server with non default value (caller,original_caller) +--let $restart_parameters = restart: --client_attribute_names=caller,original_caller +--source include/restart_mysqld.inc + +SELECT @@global.client_attribute_names; + +--echo restart the server with the default value (caller,async_id) +--let $restart_parameters = restart: +--source include/restart_mysqld.inc + +# check value is default (caller,async_id) +SELECT @@global.client_attribute_names; diff --git a/mysql-test/suite/sys_vars/t/sql_findings_control_basic.test b/mysql-test/suite/sys_vars/t/sql_findings_control_basic.test index c3a3bd3e8b83..28dbd2a14425 100644 --- a/mysql-test/suite/sys_vars/t/sql_findings_control_basic.test +++ b/mysql-test/suite/sys_vars/t/sql_findings_control_basic.test @@ -31,12 +31,13 @@ SELECT @@global.sql_findings_control; ## Restart the server with a non default value of the variable #### --echo restart the server with non default value (OFF_SOFT) ---let $_mysqld_option=--sql_findings_control=off_soft +--let $restart_parameters = restart: --sql_findings_control=off_soft --source include/restart_mysqld.inc SELECT @@global.sql_findings_control; --echo restart the server with the default value (OFF_HARD) +--let $restart_parameters = restart: --source include/restart_mysqld.inc # check value is default (OFF_HARD) diff --git a/mysql-test/suite/sys_vars/t/sql_maximum_duplicate_executions_basic.test b/mysql-test/suite/sys_vars/t/sql_maximum_duplicate_executions_basic.test index 494f86fb0810..3cd2516715e2 100644 --- a/mysql-test/suite/sys_vars/t/sql_maximum_duplicate_executions_basic.test +++ b/mysql-test/suite/sys_vars/t/sql_maximum_duplicate_executions_basic.test @@ -31,12 +31,13 @@ SELECT @@global.sql_maximum_duplicate_executions; ## Restart the server with a non default value of the variable #### --echo restart the server with non default value (5) ---let $_mysqld_option=--sql_maximum_duplicate_executions=5 +--let $restart_parameters = restart: --sql_maximum_duplicate_executions=5 --source include/restart_mysqld.inc SELECT @@global.sql_maximum_duplicate_executions; --echo restart the server with the default value (0) +--let $restart_parameters = restart: --source include/restart_mysqld.inc # check value is default (0) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index e7767619b124..cd04d659e4d2 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1527,6 +1527,12 @@ ulong column_stats_control; ulong index_stats_control; /* Controls collecting MySQL findings (aka SQL conditions) */ ulong sql_findings_control; + +/* Vector of the client attribute names */ +std::vector client_attribute_names; +/* Stores the latest value for sys_var client_attribute_names */ +char *latest_client_attribute_names = nullptr; + /* Controls whether MySQL send an error when running duplicate statements */ uint sql_maximum_duplicate_executions; /* Controls the mode of enforcement of duplicate executions of the same stmt */ @@ -8360,6 +8366,11 @@ int mysqld_main(int argc, char **argv) } } + // initialize client attribute names + if (latest_client_attribute_names != nullptr) { + store_client_attribute_names(latest_client_attribute_names); + } + create_compress_gtid_table_thread(); // NO_LINT_DEBUG diff --git a/sql/mysqld.h b/sql/mysqld.h index 2c132b3def9a..a47c46c1c7ce 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -67,6 +67,7 @@ #ifdef _WIN32 #include "sql/nt_servc.h" #endif // _WIN32 +#include #include "sql/rpl_lag_manager.h" #include "sql/set_var.h" // enum_var_type #include "sql/sql_bitmap.h" @@ -540,6 +541,9 @@ extern ulong write_auto_throttle_frequency; extern uint write_throttle_rate_step; /* Controls collecting MySQL findings (aka SQL conditions) */ extern ulong sql_findings_control; +// client attributes names system variable +extern std::vector client_attribute_names; +extern char *latest_client_attribute_names; /* Controls whether MySQL send an error when running duplicate statements */ extern uint sql_maximum_duplicate_executions; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index f59467e9a2eb..bb8413c0a2f1 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3629,12 +3629,13 @@ void THD::serialize_client_attrs() { std::vector> client_attrs; - // Populate caller, async_id - for (const auto &s : {"caller", "async_id"}) { + mysql_mutex_lock(&LOCK_global_sql_findings); + // Populate caller, original_caller, async_id, etc + for (const std::string &name_iter : client_attribute_names) { bool found_query_attrs = false; for (auto it = query_attrs_list.begin(); it != query_attrs_list.end(); ++it) { - if (it->first == s) { + if (it->first == name_iter) { client_attrs.emplace_back( String(it->first.data(), it->first.size(), &my_charset_bin), String(it->second.data(), it->second.size(), &my_charset_bin)); @@ -3643,7 +3644,7 @@ void THD::serialize_client_attrs() { } if (!found_query_attrs) { - auto it = connection_attrs_map.find(s); + auto it = connection_attrs_map.find(name_iter); if (it != connection_attrs_map.end()) { client_attrs.emplace_back( String(it->first.data(), it->first.size(), &my_charset_bin), @@ -3651,6 +3652,7 @@ void THD::serialize_client_attrs() { } } } + mysql_mutex_unlock(&LOCK_global_sql_findings); // Serialize into JSON auto &buf = client_attrs_string; diff --git a/sql/sql_info.cc b/sql/sql_info.cc index b588d5664543..180942688cd7 100644 --- a/sql/sql_info.cc +++ b/sql/sql_info.cc @@ -470,3 +470,14 @@ std::vector get_all_sql_findings() { /*********************************************************************** End - Functions to support SQL findings ************************************************************************/ + +/* + Stores the client attribute names +*/ +void store_client_attribute_names(char *new_value) { + std::vector new_attr_names = split_into_vector(new_value, ','); + + mysql_mutex_lock(&LOCK_global_sql_findings); + client_attribute_names = new_attr_names; + mysql_mutex_unlock(&LOCK_global_sql_findings); +} diff --git a/sql/sql_info.h b/sql/sql_info.h index 0ba66be3f19c..e1456b9eedf3 100644 --- a/sql/sql_info.h +++ b/sql/sql_info.h @@ -103,4 +103,7 @@ void remove_active_sql(THD *thd); End - Functions to support capping the number of duplicate executions **********************************************************************/ +/* Stores the client attribute names */ +void store_client_attribute_names(char *new_value); + #endif diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 702e1a0079b5..0d6fbb3fe13f 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -8883,6 +8883,22 @@ static Sys_var_bool Sys_show_query_digest( "Show query digest instead of full query in show process list.", SESSION_VAR(show_query_digest), CMD_LINE(OPT_ARG), DEFAULT(false)); +static bool check_client_attribute_names(sys_var *self MY_ATTRIBUTE((unused)), + THD *thd MY_ATTRIBUTE((unused)), + set_var *var) { + store_client_attribute_names(var->save_result.string_value.str); + + return false; // success +} + +static Sys_var_charptr Sys_client_attribute_names( + "client_attribute_names", + "List of supported query/connection attributes to use for " + "client_attributes (default: caller,async_id).", + GLOBAL_VAR(latest_client_attribute_names), CMD_LINE(OPT_ARG), + IN_SYSTEM_CHARSET, DEFAULT("caller,async_id"), NO_MUTEX_GUARD, + NOT_IN_BINLOG, ON_CHECK(check_client_attribute_names)); + #ifndef DBUG_OFF Debug_shutdown_actions Debug_shutdown_actions::instance; #endif