From db24f9857a204d0eb5176b833748a5e0b8236a55 Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Tue, 29 Sep 2020 21:51:41 +0300 Subject: [PATCH] postgresql_privs: fix the module mistakes a procedure for a function (#996) (#1006) * postgresql_privs: fix the module mistakes a procedure for a function * add changelog fragment * fix (cherry picked from commit 220051768be7b430416b423f7fb89a04a07ca94c) Co-authored-by: Andrew Klychkov --- ...postgresql_privs_fix_function_handling.yml | 2 ++ .../database/postgresql/postgresql_privs.py | 16 ++++++---- .../tasks/postgresql_privs_general.yml | 29 +++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 changelogs/fragments/996-postgresql_privs_fix_function_handling.yml diff --git a/changelogs/fragments/996-postgresql_privs_fix_function_handling.yml b/changelogs/fragments/996-postgresql_privs_fix_function_handling.yml new file mode 100644 index 00000000000..975cf3cd597 --- /dev/null +++ b/changelogs/fragments/996-postgresql_privs_fix_function_handling.yml @@ -0,0 +1,2 @@ +bugfixes: +- postgresql_privs - fix the module mistakes a procedure for a function (https://github.com/ansible-collections/community.general/issues/994). diff --git a/plugins/modules/database/postgresql/postgresql_privs.py b/plugins/modules/database/postgresql/postgresql_privs.py index 20cade92175..1bdccf1ed31 100644 --- a/plugins/modules/database/postgresql/postgresql_privs.py +++ b/plugins/modules/database/postgresql/postgresql_privs.py @@ -514,6 +514,7 @@ def __init__(self, params, module): self.connection = psycopg2.connect(**kw) self.cursor = self.connection.cursor() + self.pg_version = self.connection.server_version def commit(self): self.connection.commit() @@ -561,10 +562,15 @@ def get_all_sequences_in_schema(self, schema): def get_all_functions_in_schema(self, schema): if not self.schema_exists(schema): raise Error('Schema "%s" does not exist.' % schema) - query = """SELECT p.proname, oidvectortypes(p.proargtypes) - FROM pg_catalog.pg_proc p - JOIN pg_namespace n ON n.oid = p.pronamespace - WHERE nspname = %s""" + + query = ("SELECT p.proname, oidvectortypes(p.proargtypes) " + "FROM pg_catalog.pg_proc p " + "JOIN pg_namespace n ON n.oid = p.pronamespace " + "WHERE nspname = %s") + + if self.pg_version >= 110000: + query += " and p.prokind = 'f'" + self.cursor.execute(query, (schema,)) return ["%s(%s)" % (t[0], t[1]) for t in self.cursor.fetchall()] @@ -1120,7 +1126,7 @@ def main(): except psycopg2.Error as e: conn.rollback() - module.fail_json(msg=to_native(e.message)) + module.fail_json(msg=to_native(e)) if module.check_mode or not changed: conn.rollback() diff --git a/tests/integration/targets/postgresql_privs/tasks/postgresql_privs_general.yml b/tests/integration/targets/postgresql_privs/tasks/postgresql_privs_general.yml index 50bb6026e3f..4b12bf2e839 100644 --- a/tests/integration/targets/postgresql_privs/tasks/postgresql_privs_general.yml +++ b/tests/integration/targets/postgresql_privs/tasks/postgresql_privs_general.yml @@ -653,6 +653,35 @@ login_user: "{{ db_user3 }}" login_password: password +# Issue https://github.com/ansible-collections/community.general/issues/994 +- name: Create a procedure for tests + postgresql_query: + query: "CREATE PROCEDURE mock_procedure() LANGUAGE SQL AS $$ SELECT 1; $$;" + db: "{{ db_name }}" + login_user: "{{ db_user3 }}" + login_password: password + when: postgres_version_resp.stdout is version('11', '>=') + +# Issue https://github.com/ansible-collections/community.general/issues/994 +- name: Try to run module against a procedure, not function + postgresql_privs: + type: function + state: present + privs: ALL + roles: "{{ db_user2 }}" + objs: ALL_IN_SCHEMA + schema: public + db: "{{ db_name }}" + login_user: "{{ db_user3 }}" + login_password: password + register: result + when: postgres_version_resp.stdout is version('11', '>=') + +- assert: + that: + - result is not changed + when: postgres_version_resp.stdout is version('11', '>=') + ################################################# # Test ALL_IN_SCHEMA for 'partioned tables type # #################################################