1
+ ---
2
+ # Due to https://bugs.mysql.com/bug.php?id=115953, in Mysql 8, if ANSI_QUOTES is enabled,
3
+ # backticks will be used instead of double quotes to quote functions or procedures name.
4
+ # As a consequence, mysql_user and mysql_roles will always report "changed" for functions
5
+ # and procedures no matter the privileges are granted or not.
6
+ # Workaround for the mysql bug 116953 is removing ANSI_QUOTES from the module's session
7
+ # sql_mode. But because issue 671, ANSI_QUOTES is always got from GLOBAL sql_mode, thus
8
+ # this workaround can't work. Even without the Mysql bug, because sql_mode in session
9
+ # precedes GLOBAL sql_mode. we should check for sql_mode in session variable instead of
10
+ # the GLOBAL one.
11
+ - vars :
12
+ mysql_parameters : &mysql_params
13
+ login_user : ' {{ mysql_user }}'
14
+ login_password : ' {{ mysql_password }}'
15
+ login_host : ' {{ mysql_host }}'
16
+ login_port : ' {{ mysql_primary_port }}'
17
+
18
+ block :
19
+ - name : Issue-671| test setup | drop database
20
+ community.mysql.mysql_db :
21
+ << : *mysql_params
22
+ name : " {{ item }}"
23
+ state : absent
24
+ loop :
25
+ - foo
26
+ - bar
27
+
28
+ - name : Issue-671| test setup | create database
29
+ community.mysql.mysql_db :
30
+ << : *mysql_params
31
+ name : " {{ item }}"
32
+ state : present
33
+ loop :
34
+ - foo
35
+ - bar
36
+
37
+ - name : Issue-671| test setup | get value of GLOBAL.sql_mode
38
+ community.mysql.mysql_query :
39
+ << : *mysql_params
40
+ query : ' select @@GLOBAL.sql_mode AS sql_mode'
41
+ register : sql_mode_orig
42
+
43
+ - name : Issue-671| Assert sql_mode_orig
44
+ ansible.builtin.assert :
45
+ that :
46
+ - sql_mode_orig.query_result[0][0].sql_mode != None
47
+
48
+ - name : Issue-671| enable sql_mode ANSI_QUOTES
49
+ community.mysql.mysql_variables :
50
+ << : *mysql_params
51
+ variable : sql_mode
52
+ value : ' {{ sql_mode_orig.query_result[0][0].sql_mode }},ANSI_QUOTES'
53
+ mode : " {% if db_engine == 'mariadb' %}global{% else %}persist{% endif %}"
54
+
55
+ - name : Issue-671| Copy SQL scripts to remote
56
+ ansible.builtin.copy :
57
+ src : " {{ item }}"
58
+ dest : " {{ remote_tmp_dir }}/{{ item | basename }}"
59
+ loop :
60
+ - create-function.sql
61
+ - create-procedure.sql
62
+
63
+ - name : Issue-671| Create function for test
64
+ ansible.builtin.shell :
65
+ cmd : " {{ mysql_command }} < {{ remote_tmp_dir }}/create-function.sql"
66
+
67
+ - name : Issue-671| Create procedure for test
68
+ ansible.builtin.shell :
69
+ cmd : " {{ mysql_command }} < {{ remote_tmp_dir }}/create-procedure.sql"
70
+
71
+ - name : Issue-671| Create user with FUNCTION and PROCEDURE privileges
72
+ community.mysql.mysql_user :
73
+ << : *mysql_params
74
+ name : ' {{ user_name_2 }}'
75
+ password : ' {{ user_password_2 }}'
76
+ state : present
77
+ priv : ' FUNCTION foo.function:EXECUTE/foo.*:SELECT/PROCEDURE bar.procedure:EXECUTE'
78
+
79
+ - name : Issue-671| Grant the privileges again, remove ANSI_QUOTES from the session variable
80
+ community.mysql.mysql_user :
81
+ << : *mysql_params
82
+ session_vars :
83
+ sql_mode : " "
84
+ name : ' {{ user_name_2 }}'
85
+ password : ' {{ user_password_2 }}'
86
+ state : present
87
+ priv : ' FUNCTION foo.function:EXECUTE/foo.*:SELECT/PROCEDURE bar.procedure:EXECUTE'
88
+ register : result
89
+ failed_when :
90
+ - result is failed or result is changed
91
+
92
+ - name : Issue-671| Test teardown | cleanup databases
93
+ community.mysql.mysql_db :
94
+ << : *mysql_params
95
+ name : " {{ item }}"
96
+ state : absent
97
+ loop :
98
+ - foo
99
+ - bar
100
+
101
+ - name : Issue-671| set sql_mode back to original value
102
+ community.mysql.mysql_variables :
103
+ << : *mysql_params
104
+ variable : sql_mode
105
+ value : ' {{ sql_mode_orig.query_result[0][0].sql_mode }}'
106
+ mode : " {% if db_engine == 'mariadb' %}global{% else %}persist{% endif %}"
107
+
108
+ - name : Issue-671| Teardown user_name_2
109
+ ansible.builtin.include_tasks :
110
+ file : utils/remove_user.yml
111
+ vars :
112
+ user_name : " {{ user_name_2 }}"
0 commit comments