From b0475566ca61cdcfff07f8a24ef0ddcf9f46f1a7 Mon Sep 17 00:00:00 2001 From: Ganesh Jaybhay Date: Mon, 21 Sep 2020 11:05:56 +0530 Subject: [PATCH] =?UTF-8?q?Fixed=20reverse=20engineering=20SQL=20where?= =?UTF-8?q?=C2=A0parenthesis=20is=20not=20properly=20arranged=20for=20View?= =?UTF-8?q?/MView=20definition.=20Fixes=20#5830?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en_US/release_notes_4_27.rst | 1 + .../mviews/pg/9.3_plus/sql/properties.sql | 2 +- .../mviews/pg/9.4_plus/sql/properties.sql | 2 +- .../mviews/ppas/9.3_plus/sql/properties.sql | 2 +- .../views/gpdb_5.0_plus/sql/properties.sql | 2 +- .../views/pg/9.1_plus/sql/properties.sql | 2 +- .../views/pg/9.2_plus/sql/properties.sql | 2 +- .../views/pg/9.3_plus/sql/properties.sql | 2 +- .../views/pg/9.4_plus/sql/properties.sql | 2 +- .../views/ppas/9.1_plus/sql/properties.sql | 2 +- .../views/ppas/9.2_plus/sql/properties.sql | 2 +- .../views/ppas/9.3_plus/sql/properties.sql | 2 +- .../views/ppas/9.4_plus/sql/properties.sql | 2 +- .../schemas/views/tests/test_views_get.py | 22 +++++++++++++++++-- 14 files changed, 33 insertions(+), 14 deletions(-) diff --git a/docs/en_US/release_notes_4_27.rst b/docs/en_US/release_notes_4_27.rst index f718d1ba3..29ec10f11 100644 --- a/docs/en_US/release_notes_4_27.rst +++ b/docs/en_US/release_notes_4_27.rst @@ -20,4 +20,5 @@ Bug fixes | `Issue #5417 `_ - Fixed and improve API test cases for the schema diff tool. | `Issue #5802 `_ - Remove maximum length on the password field in the server dialog. | `Issue #5807 `_ - Fixed an issue where a column is renamed and then removed, then the drop SQL query takes the wrong column name. +| `Issue #5830 `_ - Fixed reverse engineering SQL where parenthesis is not properly arranged for View/MView definition. | `Issue #5839 `_ - Ensure that multiple extensions can be dropped from the properties tab. \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.3_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.3_plus/sql/properties.sql index 39b435cb8..b2d6e4605 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.3_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.3_plus/sql/properties.sql @@ -15,7 +15,7 @@ SELECT nsp.nspname as schema, pg_get_userbyid(c.relowner) AS owner, description AS comment, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ============= Checks if it is system view ================ #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.4_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.4_plus/sql/properties.sql index 39b435cb8..b2d6e4605 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.4_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/pg/9.4_plus/sql/properties.sql @@ -15,7 +15,7 @@ SELECT nsp.nspname as schema, pg_get_userbyid(c.relowner) AS owner, description AS comment, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ============= Checks if it is system view ================ #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/9.3_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/9.3_plus/sql/properties.sql index 39b435cb8..b2d6e4605 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/9.3_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/mviews/ppas/9.3_plus/sql/properties.sql @@ -15,7 +15,7 @@ SELECT nsp.nspname as schema, pg_get_userbyid(c.relowner) AS owner, description AS comment, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ============= Checks if it is system view ================ #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/gpdb_5.0_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/gpdb_5.0_plus/sql/properties.sql index a1daa345b..456f33c56 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/gpdb_5.0_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/gpdb_5.0_plus/sql/properties.sql @@ -8,7 +8,7 @@ SELECT description AS comment, c.reltablespace AS spcoid, pg_get_userbyid(c.relowner) AS owner, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, array_to_string(c.relacl::text[], ', ') AS acl, {#=============Checks if it is system view================#} {% if vid and datlastsysoid %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/properties.sql index 005af504e..e28d847e7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/properties.sql @@ -8,7 +8,7 @@ SELECT description AS comment, c.reltablespace AS spcoid, pg_get_userbyid(c.relowner) AS owner, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, array_to_string(c.relacl::text[], ', ') AS acl, {#=============Checks if it is system view================#} {% if vid and datlastsysoid %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/properties.sql index 82be52cbe..3b443f946 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/properties.sql @@ -8,7 +8,7 @@ SELECT (CASE WHEN length(spc.spcname::text) > 0 THEN spc.spcname ELSE 'pg_default' END) as spcname, pg_get_userbyid(c.relowner) AS owner, description As comment, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, nsp.nspname AS schema, array_to_string(c.relacl::text[], ', ') AS acl, {#=============Checks if it is system view================#} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/properties.sql index 45f9a769d..8af43c86e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/properties.sql @@ -11,7 +11,7 @@ SELECT c.relispopulated AS ispopulated, pg_get_userbyid(c.relowner) AS owner, array_to_string(c.relacl::text[], ', ') AS acl, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ===== Checks if it is system view ===== #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/properties.sql index aa749ff35..cd44282f3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/properties.sql @@ -12,7 +12,7 @@ SELECT c.relispopulated AS ispopulated, pg_get_userbyid(c.relowner) AS owner, array_to_string(c.relacl::text[], ', ') AS acl, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ===== Checks if it is system view ===== #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/properties.sql index 7a14f1d82..d81e8723c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/properties.sql @@ -11,7 +11,7 @@ SELECT c.relispopulated AS ispopulated, pg_get_userbyid(c.relowner) AS owner, array_to_string(c.relacl::text[], ', ') AS acl, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ===== Checks if it is system view ===== #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/properties.sql index e2764c622..b29eccf0e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/properties.sql @@ -7,7 +7,7 @@ SELECT (CASE WHEN length(spc.spcname::text) > 0 THEN spc.spcname ELSE 'pg_default' END) as spcname, pg_get_userbyid(c.relowner) AS owner, description As comment, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, nsp.nspname AS schema, array_to_string(c.relacl::text[], ', ') AS acl, {#=============Checks if it is system view================#} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/properties.sql index 45f9a769d..8af43c86e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/properties.sql @@ -11,7 +11,7 @@ SELECT c.relispopulated AS ispopulated, pg_get_userbyid(c.relowner) AS owner, array_to_string(c.relacl::text[], ', ') AS acl, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ===== Checks if it is system view ===== #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/properties.sql index aa749ff35..cd44282f3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/properties.sql @@ -12,7 +12,7 @@ SELECT c.relispopulated AS ispopulated, pg_get_userbyid(c.relowner) AS owner, array_to_string(c.relacl::text[], ', ') AS acl, - pg_get_viewdef(c.oid, true) AS definition, + pg_get_viewdef(c.oid) AS definition, {# ===== Checks if it is system view ===== #} {% if vid and datlastsysoid %} CASE WHEN {{vid}} <= {{datlastsysoid}} THEN True ELSE False END AS system_view, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py index 5f5d7a991..479cd7afa 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/test_views_get.py @@ -8,6 +8,7 @@ ########################################################################## import uuid +import json from pgadmin.browser.server_groups.servers.databases.schemas.tests import \ utils as schema_utils @@ -27,15 +28,29 @@ class ViewsGetTestCase(BaseTestGenerator): m_view_sql = "CREATE MATERIALIZED VIEW %s.%s TABLESPACE pg_default AS " \ "SELECT 'test_pgadmin' WITH NO DATA;ALTER TABLE %s.%s OWNER" \ " TO %s" + view_sql_with_bracket = "CREATE OR REPLACE VIEW %s.%s AS " \ + "SELECT CASE WHEN (pg_db.datistemplate = false " \ + "AND pg_db.datallowconn = true AND " \ + "(pg_db.datconnlimit = -1 OR " \ + "pg_db.datacl is null)) then true else false " \ + "end as res FROM pg_database pg_db; " \ + "ALTER TABLE %s.%s OWNER TO %s" scenarios = [ ('Get view under schema node', dict( url='/browser/view/obj/', view_name="test_view_get_%s" % (str(uuid.uuid4())[1:8]), - sql_query=view_sql)), + sql_query=view_sql, + type='view_without_conditions')), ('Get materialized view under schema node', dict(url='/browser/mview/obj/', view_name="test_mview_get_%s" % (str(uuid.uuid4())[1:8]), - sql_query=m_view_sql)) + sql_query=m_view_sql, + type='m_view_without_conditions')), + ('Get view having brackets in script under schema node', dict( + url='/browser/view/obj/', + view_name="test_view_get_%s" % (str(uuid.uuid4())[1:8]), + sql_query=view_sql_with_bracket, + type='view_with_conditions')) ] def setUp(self): @@ -77,6 +92,9 @@ class ViewsGetTestCase(BaseTestGenerator): follow_redirects=True ) self.assertEqual(response.status_code, 200) + if self.type == 'view_with_conditions': + response_data = json.loads(response.data.decode('utf-8')) + self.assertIn('((pg_db.datistemplate', response_data['definition']) def tearDown(self): # Disconnect the database