mirror of
https://github.com/ansible-collections/community.mysql.git
synced 2025-04-26 12:21:27 -07:00
issue-671: get ASNI_QUOTES from session sql_mode instead of GLOBAL sql_mode
This commit is contained in:
parent
28bf7093be
commit
6d4fc3c24f
3 changed files with 117 additions and 1 deletions
|
@ -32,7 +32,7 @@ class InvalidPrivsError(Exception):
|
|||
|
||||
|
||||
def get_mode(cursor):
|
||||
cursor.execute('SELECT @@GLOBAL.sql_mode')
|
||||
cursor.execute('SELECT @@sql_mode')
|
||||
result = cursor.fetchone()
|
||||
mode_str = result[0]
|
||||
if 'ANSI' in mode_str:
|
||||
|
|
112
tests/integration/targets/test_mysql_user/tasks/issue-671.yaml
Normal file
112
tests/integration/targets/test_mysql_user/tasks/issue-671.yaml
Normal file
|
@ -0,0 +1,112 @@
|
|||
---
|
||||
# Due to https://bugs.mysql.com/bug.php?id=115953, in Mysql 8, if ANSI_QUOTES is enabled,
|
||||
# backticks will be used instead of double quotes to quote functions or procedures name.
|
||||
# As a consequence, mysql_user and mysql_roles will always report "changed" for functions
|
||||
# and procedures no matter the privileges are granted or not.
|
||||
# Workaround for the mysql bug 116953 is removing ANSI_QUOTES from the module's session
|
||||
# sql_mode. But because issue 671, ANSI_QUOTES is always got from GLOBAL sql_mode, thus
|
||||
# this workaround can't work. Even without the Mysql bug, because sql_mode in session
|
||||
# precedes GLOBAL sql_mode. we should check for sql_mode in session variable instead of
|
||||
# the GLOBAL one.
|
||||
- vars:
|
||||
mysql_parameters: &mysql_params
|
||||
login_user: '{{ mysql_user }}'
|
||||
login_password: '{{ mysql_password }}'
|
||||
login_host: '{{ mysql_host }}'
|
||||
login_port: '{{ mysql_primary_port }}'
|
||||
|
||||
block:
|
||||
- name: Issue-671| test setup | drop database
|
||||
mysql_db:
|
||||
<<: *mysql_params
|
||||
name: "{{ item }}"
|
||||
state: absent
|
||||
loop:
|
||||
- foo
|
||||
- bar
|
||||
|
||||
- name: Issue-671| test setup | create database
|
||||
mysql_db:
|
||||
<<: *mysql_params
|
||||
name: "{{ item }}"
|
||||
state: present
|
||||
loop:
|
||||
- foo
|
||||
- bar
|
||||
|
||||
- name: Issue-671| test setup | get value of GLOBAL.sql_mode
|
||||
mysql_query:
|
||||
<<: *mysql_params
|
||||
query: 'select @@GLOBAL.sql_mode AS sql_mode'
|
||||
register: sql_mode_orig
|
||||
|
||||
- name: Issue-671| enable sql_mode ANSI_QUOTES
|
||||
mysql_variables:
|
||||
<<: *mysql_params
|
||||
variable: sql_mode
|
||||
value: '{{ sql_mode_orig.query_result[0][0].sql_mode }},ANSI_QUOTES'
|
||||
mode: persist
|
||||
|
||||
- name: Issue-671| test setup | get value of GLOBAL.sql_mode
|
||||
mysql_query:
|
||||
<<: *mysql_params
|
||||
query: 'select @@GLOBAL.sql_mode'
|
||||
|
||||
- name: Issue-671| Copy SQL scripts to remote
|
||||
copy:
|
||||
src: "{{ item }}"
|
||||
dest: "{{ remote_tmp_dir }}/{{ item | basename }}"
|
||||
with_items:
|
||||
- create-function.sql
|
||||
- create-procedure.sql
|
||||
|
||||
- name: Issue-671| Create function for test
|
||||
shell: "{{ mysql_command }} < {{ remote_tmp_dir }}/create-function.sql"
|
||||
|
||||
- name: Issue-671| Create procedure for test
|
||||
shell: "{{ mysql_command }} < {{ remote_tmp_dir }}/create-procedure.sql"
|
||||
|
||||
- name: Issue-671| Create user with FUNCTION and PROCEDURE privileges
|
||||
mysql_user:
|
||||
<<: *mysql_params
|
||||
name: '{{ user_name_2 }}'
|
||||
password: '{{ user_password_2 }}'
|
||||
state: present
|
||||
priv: 'FUNCTION foo.function:EXECUTE/foo.*:SELECT/PROCEDURE bar.procedure:EXECUTE'
|
||||
|
||||
- name: Issue-671| Grant the privileges again, remove ANSI_QUOTES from the session variable
|
||||
mysql_user:
|
||||
<<: *mysql_params
|
||||
session_vars:
|
||||
sql_mode: ""
|
||||
name: '{{ user_name_2 }}'
|
||||
password: '{{ user_password_2 }}'
|
||||
state: present
|
||||
priv: 'FUNCTION foo.function:EXECUTE/foo.*:SELECT/PROCEDURE bar.procedure:EXECUTE'
|
||||
register: result
|
||||
|
||||
- name: Issue-671| Assert Create user with FUNCTION and PROCEDURE privileges
|
||||
assert:
|
||||
that:
|
||||
- result is success
|
||||
- result is not changed
|
||||
|
||||
- name: Issue-671| Test teardown | cleanup databases
|
||||
mysql_db:
|
||||
<<: *mysql_params
|
||||
name: "{{ item }}"
|
||||
state: absent
|
||||
loop:
|
||||
- foo
|
||||
- bar
|
||||
|
||||
- name: Issue-671| set sql_mode back to original value
|
||||
mysql_variables:
|
||||
<<: *mysql_params
|
||||
variable: sql_mode
|
||||
value: '{{ sql_mode_orig.query_result[0][0].sql_mode }}'
|
||||
mode: persist
|
||||
|
||||
- include_tasks: utils/remove_user.yml
|
||||
vars:
|
||||
user_name: "{{ user_name_2 }}"
|
|
@ -282,6 +282,10 @@
|
|||
- import_tasks: issue-64560.yaml
|
||||
tags:
|
||||
- issue-64560
|
||||
|
||||
- import_tasks: issue-671.yaml
|
||||
tags:
|
||||
- issue-671
|
||||
|
||||
# Test that mysql_user still works with force_context enabled (database set to "mysql")
|
||||
# (https://github.com/ansible-collections/community.mysql/issues/265)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue