Re: Resql test cases for views and fix for bug: 4650

Usman Muzaffar <[email protected]>
Newsgroups gmane.comp.db.postgresql.pgadmin.devel
Message-ID <CAOiUKEP1z-QajyDqBf6Kvbh2K5hfEZFPd_WWYHWQqtG5B82imQ@mail.gmail.com>
Hi,
Please find here updated patch with the above required test cases.

Please review and commit the changes

On Tue, Aug 27, 2019 at 12:44 PM Akshay Joshi <[email protected]>
wrote:

> Hi Usman
>
> I have modified the code, please work on the following test cases:
>
>    - No test case for privileges at all.
>    - We should add alter test cases for check_option, security_barrier
>    and privileges.
>
> Attached is the modified patch, please continue your work on it.
>
> On Tue, Aug 27, 2019 at 12:12 PM Usman Muzaffar <
> [email protected]> wrote:
>
>> Just a correction, bug reference in above mail should be *4486* instead
>> of *4650*.
>>
>> On Mon, Aug 26, 2019 at 7:50 PM Usman Muzaffar <
>> [email protected]> wrote:
>>
>>> Hi Hackers,
>>>
>>> Please find here attached patch for sql re engineering test cases for
>>> views node. As part of this patch I have also incorported followings
>>>
>>>    - Fix for bug # 4650
>>>    - Also modified views/template/create.sql due to which, apparently
>>>    same output and input was not matching for test cases.
>>>
>>> Following are verified before sending the patch
>>>
>>>    - yarn run pep8
>>>    - verified test cases on all pg/ppas server e.g. pg 9.4 to 11 and
>>>    ppas 9.4 to 11.
>>>
>>>
>>> --
>>>
>>>
>>> Thanks,
>>>
>>> Usman Muzaffar
>>> QA Team
>>> EnterpriseDB Corporation
>>>
>>
>>
>> --
>>
>>
>> Thanks,
>>
>> Usman Muzaffar
>> QA Team
>> EnterpriseDB Corporation
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>


-- 


Thanks,

Usman Muzaffar
QA Team
EnterpriseDB Corporation
view_re_sql_testcases_v3.patch (application/octet-stream, 22.6 KB)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/view_id.sql
index 64181cd64..4916e090f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.1_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name |qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/create.sql
index 8d5f729f4..3e04ea1d2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/create.sql
@@ -6,9 +6,9 @@
 
 {% endif %}
 {% if data.name and data.schema and data.definition %}
-CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}{{'\r'}}
+CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}
 WITH (
-{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}{{'\r'}}
+{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}
 ){% endif %} AS
 {{ data.definition.rstrip(';') }};
 {% if data.owner %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/view_id.sql
index 64181cd64..4916e090f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.2_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name |qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/create.sql
index d1eec0860..e5068b256 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/create.sql
@@ -6,9 +6,9 @@
 
 {% endif %}
 {% if data.name and data.schema and data.definition %}
-CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}{{'\r'}}
+CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}
 WITH (
-{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}{{'\r'}}
+{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}
 ){% endif %} AS
 {{ data.definition.rstrip(';') }};
 {% if data.owner %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/view_id.sql
index 64181cd64..4916e090f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.3_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name |qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/create.sql
index b43b51984..3d8ae374c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/create.sql
@@ -6,8 +6,14 @@
 
 {% endif %}
 {% if data.name and data.schema and data.definition %}
-CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if ((data.check_option and data.check_option.lower() != 'no') or data.security_barrier) %}{{ '\n' }}WITH (
-{% if data.check_option and data.check_option.lower() != 'no' %}    check_option={{ data.check_option }}{% endif %}{{ ',\r' if data.check_option and data.check_option.lower() != 'no' and data.security_barrier }}{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}{{'\r'}}
+CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}
+{% if ((data.check_option and data.check_option.lower() != 'no') or data.security_barrier) %}
+WITH ({% if data.check_option and data.check_option.lower() != 'no' %}
+
+  check_option={{ data.check_option }}{% endif %}{{ ',' if data.check_option and data.check_option.lower() != 'no' and data.security_barrier }}
+{% if data.security_barrier %}
+  security_barrier={{ data.security_barrier|lower }}
+{% endif %}
 ){% endif %} AS
 {{ data.definition.rstrip(';') }};
 {% if data.owner and data.m_view is undefined %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/view_id.sql
index 64181cd64..4916e090f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/pg/9.4_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name |qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/view_id.sql
index 64181cd64..445047489 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.1_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name|qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/create.sql
index d1eec0860..e5068b256 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/create.sql
@@ -6,9 +6,9 @@
 
 {% endif %}
 {% if data.name and data.schema and data.definition %}
-CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}{{'\r'}}
+CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}
 WITH (
-{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}{{'\r'}}
+{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}
 ){% endif %} AS
 {{ data.definition.rstrip(';') }};
 {% if data.owner %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/view_id.sql
index 64181cd64..445047489 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.2_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name|qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/create.sql
index d1eec0860..e5068b256 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/create.sql
@@ -6,9 +6,9 @@
 
 {% endif %}
 {% if data.name and data.schema and data.definition %}
-CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}{{'\r'}}
+CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if (data.security_barrier) %}
 WITH (
-{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}{{'\r'}}
+{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}
 ){% endif %} AS
 {{ data.definition.rstrip(';') }};
 {% if data.owner %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/view_id.sql
index 64181cd64..445047489 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.3_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name|qtLiteral }} and nsp.nspname = '{{ data.schema }}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/create.sql
index b43b51984..3d8ae374c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/create.sql
@@ -6,8 +6,14 @@
 
 {% endif %}
 {% if data.name and data.schema and data.definition %}
-CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}{% if ((data.check_option and data.check_option.lower() != 'no') or data.security_barrier) %}{{ '\n' }}WITH (
-{% if data.check_option and data.check_option.lower() != 'no' %}    check_option={{ data.check_option }}{% endif %}{{ ',\r' if data.check_option and data.check_option.lower() != 'no' and data.security_barrier }}{% if data.security_barrier %}    security_barrier={{ data.security_barrier|lower }}{% endif %}{{'\r'}}
+CREATE OR REPLACE VIEW {{ conn|qtIdent(data.schema, data.name) }}
+{% if ((data.check_option and data.check_option.lower() != 'no') or data.security_barrier) %}
+WITH ({% if data.check_option and data.check_option.lower() != 'no' %}
+
+  check_option={{ data.check_option }}{% endif %}{{ ',' if data.check_option and data.check_option.lower() != 'no' and data.security_barrier }}
+{% if data.security_barrier %}
+  security_barrier={{ data.security_barrier|lower }}
+{% endif %}
 ){% endif %} AS
 {{ data.definition.rstrip(';') }};
 {% if data.owner and data.m_view is undefined %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/view_id.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/view_id.sql
index 64181cd64..a6d9b0b2e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/view_id.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/templates/views/ppas/9.4_plus/sql/view_id.sql
@@ -2,5 +2,5 @@
 {% if data %}
 SELECT c.oid, c.relname FROM pg_class c
 LEFT OUTER JOIN pg_namespace nsp on nsp.oid = c.relnamespace
-WHERE c.relname = '{{ data.name }}' and nsp.nspname = '{{ data.schema }}';
+WHERE c.relname = {{ data.name|qtLiteral }} and nsp.nspname = '{{ data.schema}}';
 {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/alter_view.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/alter_view.sql
new file mode 100644
index 000000000..47542ab90
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/alter_view.sql
@@ -0,0 +1,20 @@
+-- View: public."testview_$%{}[]()&*^!@""'`\/#"
+
+-- DROP VIEW public."testview_$%{}[]()&*^!@""'`\/#";
+
+CREATE OR REPLACE VIEW public."testview_$%{}[]()&*^!@""'`\/#"
+WITH (
+  check_option=cascaded,
+  security_barrier=true
+) AS
+ SELECT test_view_table.col1
+   FROM test_view_table;
+
+ALTER TABLE public."testview_$%{}[]()&*^!@""'`\/#"
+    OWNER TO postgres;
+COMMENT ON VIEW public."testview_$%{}[]()&*^!@""'`\/#"
+    IS 'Testcomment-updated';
+
+GRANT ALL ON TABLE public."testview_$%{}[]()&*^!@""'`\/#" TO postgres;
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/create_view.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/create_view.sql
new file mode 100644
index 000000000..a1901611a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/create_view.sql
@@ -0,0 +1,17 @@
+-- View: public."testview_$%{}[]()&*^!@""'`\/#"
+
+-- DROP VIEW public."testview_$%{}[]()&*^!@""'`\/#";
+
+CREATE OR REPLACE VIEW public."testview_$%{}[]()&*^!@""'`\/#"
+WITH (
+  check_option=local
+) AS
+ SELECT test_view_table.col1
+   FROM test_view_table;
+
+ALTER TABLE public."testview_$%{}[]()&*^!@""'`\/#"
+    OWNER TO postgres;
+COMMENT ON VIEW public."testview_$%{}[]()&*^!@""'`\/#"
+    IS 'Testcomment';
+
+GRANT ALL ON TABLE public."testview_$%{}[]()&*^!@""'`\/#" TO postgres;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/tests.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/tests.json
new file mode 100644
index 000000000..864ae34d1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/pg/9.4_plus/tests.json
@@ -0,0 +1,78 @@
+{
+  "scenarios": [
+    {
+      "type": "create",
+      "name": "Create Table for Views",
+      "endpoint": "NODE-table.obj",
+      "sql_endpoint": "NODE-table.sql_id",
+      "data": {
+        "name": "test_view_table",
+        "check_constraint": [],
+        "coll_inherits": "[]",
+        "columns": [
+          {
+            "name": "col1",
+            "cltype": "integer"
+          }
+        ],
+        "schema": "public"
+      }
+    },
+    {
+      "type": "create",
+      "name": "Create View",
+      "endpoint": "NODE-view.obj",
+      "sql_endpoint": "NODE-view.sql_id",
+      "data": {
+        "definition": "select col1 from test_view_table;",
+        "name": "testview_$%{}[]()&*^!@\"'`\\/#",
+        "owner": "postgres",
+        "schema": "public",
+        "check_option": "local",
+        "security_barrier": false,
+        "comment":"Testcomment",
+        "datacl":[{"grantee":"postgres", "grantor":"postgres", "privileges":[{"privilege_type": "a", "privilege": true,
+                  "with_grant":false}]}]
+      },
+      "expected_sql_file": "create_view.sql"
+    },
+    {
+      "type": "alter",
+      "name": "Alter View",
+      "endpoint": "NODE-view.obj_id",
+      "sql_endpoint": "NODE-view.sql_id",
+      "data": {
+        "definition": "select col1 from test_view_table;",
+        "name": "testview_$%{}[]()&*^!@\"'`\\/#",
+        "owner": "postgres",
+        "schema": "public",
+        "check_option": "cascaded",
+        "security_barrier": true,
+        "comment":"Testcomment-updated",
+        "datacl":[{"grantee":"postgres", "grantor":"postgres", "privileges":[{"privilege_type": "a", "privilege": true,
+                  "with_grant":false}]}]
+      },
+      "expected_sql_file": "alter_view.sql"
+    },
+    {
+      "type": "delete",
+      "name": "Drop View",
+      "endpoint": "NODE-view.obj_id",
+      "data": {
+        "name": "testview_$%{}[]()&*^!@\"'`\\/#",
+        "owner": "postgres",
+        "schema": "public"
+      }
+    },
+    {
+      "type": "delete",
+      "name": "Drop Table for view",
+      "endpoint": "NODE-table.obj_id",
+      "data": {
+        "name": "test_view_table",
+        "owner": "postgres",
+        "schema": "public"
+      }
+    }
+  ]
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/alter_view.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/alter_view.sql
new file mode 100644
index 000000000..6d33e6400
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/alter_view.sql
@@ -0,0 +1,18 @@
+-- View: public."testview1_$%{}[]()&*^!@""'`\/#"
+
+-- DROP VIEW public."testview1_$%{}[]()&*^!@""'`\/#";
+
+CREATE OR REPLACE VIEW public."testview1_$%{}[]()&*^!@""'`\/#"
+WITH (
+  check_option=cascaded,
+  security_barrier=true
+) AS
+ SELECT test_view_table.col1
+   FROM test_view_table;
+
+ALTER TABLE public."testview1_$%{}[]()&*^!@""'`\/#"
+    OWNER TO enterprisedb;
+COMMENT ON VIEW public."testview1_$%{}[]()&*^!@""'`\/#"
+    IS 'Testcomment-updated';
+
+GRANT ALL ON TABLE public."testview1_$%{}[]()&*^!@""'`\/#" TO enterprisedb;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/create_view.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/create_view.sql
new file mode 100644
index 000000000..37a68a320
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/create_view.sql
@@ -0,0 +1,21 @@
+-- View: public."testview_$%{}[]()&*^!@""'`\/#"
+
+-- DROP VIEW public."testview_$%{}[]()&*^!@""'`\/#";
+
+CREATE OR REPLACE VIEW public."testview_$%{}[]()&*^!@""'`\/#"
+WITH (
+  check_option=local
+) AS
+ SELECT test_view_table.col1
+   FROM test_view_table;
+
+ALTER TABLE public."testview_$%{}[]()&*^!@""'`\/#"
+    OWNER TO enterprisedb;
+COMMENT ON VIEW public."testview_$%{}[]()&*^!@""'`\/#"
+    IS 'Testcomment';
+
+GRANT ALL ON TABLE public."testview_$%{}[]()&*^!@""'`\/#" TO enterprisedb;
+
+
+
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/tests.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/tests.json
new file mode 100644
index 000000000..ce9aa5d65
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/tests/ppas/9.4_plus/tests.json
@@ -0,0 +1,76 @@
+{
+  "scenarios": [{
+      "type": "create",
+      "name": "Create Table for Views",
+      "endpoint": "NODE-table.obj",
+      "sql_endpoint": "NODE-table.sql_id",
+      "data":{
+        "name":"test_view_table",
+        "check_constraint": [],
+        "coll_inherits": "[]",
+        "columns": [
+            {
+                "name": "col1",
+                "cltype": "integer"
+            }
+        ],
+        "schema": "public"
+      }
+    },
+    {
+      "type": "create",
+      "name": "Create View",
+      "endpoint": "NODE-view.obj",
+      "sql_endpoint": "NODE-view.sql_id",
+      "data": {
+        "datacl":[{"grantee":"enterprisedb", "grantor":"enterprisedb", "privileges":[{"privilege_type": "a", "privilege": true, "with_grant":
+      false}]}],
+        "definition": "select col1 from test_view_table;",
+        "name": "testview_$%{}[]()&*^!@\"'`\\/#",
+        "owner": "enterprisedb",
+        "schema": "public",
+        "check_option": "local",
+        "security_barrier": false,
+        "comment":"Testcomment"
+      },
+      "expected_sql_file": "create_view.sql"
+    },
+    {
+      "type": "alter",
+      "name": "Alter View",
+      "endpoint": "NODE-view.obj_id",
+      "sql_endpoint": "NODE-view.sql_id",
+      "data": {
+        "definition": "select col1 from test_view_table;",
+        "name": "testview1_$%{}[]()&*^!@\"'`\\/#",
+        "owner": "enterprisedb",
+        "schema": "public",
+        "check_option": "cascaded",
+        "security_barrier": true,
+        "comment":"Testcomment-updated",
+        "datacl":[{"grantee":"enterprisedb", "grantor":"enterprisedb", "privileges":[{"privilege_type": "a", "privilege": false,
+                  "with_grant":false}]}]
+      },
+      "expected_sql_file": "alter_view.sql"
+    },
+    {
+      "type": "delete",
+      "name": "Drop View",
+      "endpoint": "NODE-view.obj_id",
+      "data": {
+        "name": "testview1_$%{}[]()&*^!@\"'`\\/#",
+        "owner": "enterprisedb",
+        "schema": "public"
+      }
+    },
+    {
+      "type": "delete",
+      "name": "Drop Table for Views",
+      "endpoint": "NODE-table.obj_id",
+      "data": {
+        "name": "test_view_table",
+        "owner": "enterprisedb",
+        "schema": "public"
+      }
+    }]
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.