From 09db21e5c115e1526add3ddf4ac5b74a986dab2c Mon Sep 17 00:00:00 2001
From: George Gelashvili and Tira Odhner <pair+ggelashvili+aodhner@pivotal.io>
Date: Wed, 8 Feb 2017 10:33:25 -0500
Subject: [PATCH 2/3] Add Greenplum-compatible SQL template for the table node

---
 .../tables/templates/table/sql/9.1_plus/nodes.sql  |  7 +++
 .../tables/templates/table/sql/default/nodes.sql   |  4 +-
 .../templates/table/sql/tests/test_tables_node.py  | 60 ++++++++++++++++++++++
 web/regression/test_utils.py                       | 37 +++++++++++++
 4 files changed, 106 insertions(+), 2 deletions(-)
 create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql
 create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py

diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql
new file mode 100644
index 00000000..409247cd
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/9.1_plus/nodes.sql
@@ -0,0 +1,7 @@
+SELECT rel.oid, rel.relname AS name,
+    (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgisinternal = FALSE) AS triggercount,
+    (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgisinternal = FALSE AND tgenabled = 'O') AS has_enable_triggers
+FROM pg_class rel
+    WHERE rel.relkind IN ('r','s','t') AND rel.relnamespace = {{ scid }}::oid
+    {% if tid %} AND rel.oid = {{tid}}::OID {% endif %}
+    ORDER BY rel.relname;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/default/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/default/nodes.sql
index 409247cd..01a88e0e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/default/nodes.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/default/nodes.sql
@@ -1,6 +1,6 @@
 SELECT rel.oid, rel.relname AS name,
-    (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgisinternal = FALSE) AS triggercount,
-    (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgisinternal = FALSE AND tgenabled = 'O') AS has_enable_triggers
+    (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid) AS triggercount,
+    (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid AND tgenabled = 'O') AS has_enable_triggers
 FROM pg_class rel
     WHERE rel.relkind IN ('r','s','t') AND rel.relnamespace = {{ scid }}::oid
     {% if tid %} AND rel.oid = {{tid}}::OID {% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py
new file mode 100644
index 00000000..fb204e49
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py
@@ -0,0 +1,60 @@
+import os
+
+from jinja2 import BaseLoader
+from jinja2 import Environment
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression import test_utils
+
+
+class TestTablesNode(BaseTestGenerator):
+    def runTest(self):
+        """
+            This tests that all applicable sql template versions can fetch table names
+        """
+        with test_utils.Database(self.server) as (connection, database_name):
+            test_utils.create_table(self.server, database_name, "test_table")
+
+            if connection.server_version < 91000:
+                self.versions_to_test = ['default']
+            else:
+                self.versions_to_test = ['default', '9.1_plus']
+
+            for version in self.versions_to_test:
+                template_file = os.path.join(os.path.dirname(__file__), "..", version, "nodes.sql")
+                file_content = open(template_file, 'r').read()
+
+                env = Environment(loader=SimpleTemplateLoader(file_content))
+
+                template = env.get_template("")
+                public_schema_id = 2200
+                sql = template.render(scid=public_schema_id)
+
+                cursor = connection.cursor()
+                cursor.execute(sql)
+                fetch_result = cursor.fetchall()
+
+                first_row = {}
+                for index, description in enumerate(cursor.description):
+                    first_row[description.name] = fetch_result[0][index]
+
+                print first_row
+
+                oid = first_row['oid']
+                name = first_row['name']
+                triggercount = first_row['triggercount']
+                has_enable_triggers = first_row['has_enable_triggers']
+
+                self.assertIsNotNone(long(oid))
+                self.assertEqual('test_table', name)
+                # triggercount is sometimes returned as a string for some reason
+                self.assertEqual(0L, long(triggercount))
+                self.assertIsNotNone(long(has_enable_triggers))
+
+
+class SimpleTemplateLoader(BaseLoader):
+    def __init__(self, file_content):
+        self.file_content = file_content
+
+    def get_source(self, *args):
+        return self.file_content, "required-return-not-a-real-file.txt", True
diff --git a/web/regression/test_utils.py b/web/regression/test_utils.py
index 2dbf47bb..11b1c689 100644
--- a/web/regression/test_utils.py
+++ b/web/regression/test_utils.py
@@ -408,3 +408,40 @@ def _drop_objects(tester):
 def get_cleanup_handler(tester):
     """This function use to bind variable to drop_objects function"""
     return partial(_drop_objects, tester)
+
+
+class Database:
+    """
+    Temporarily create and connect to a database, tear it down at exit
+
+    example:
+
+    with Database(server, 'some_test_db') as (connection, database_name):
+        connection.cursor().execute(...)
+
+    """
+
+    def __init__(self, server):
+        self.name = None
+        self.server = server
+        self.maintenance_connection = None
+        self.connection = None
+
+    def __enter__(self):
+        self.name = "test_db_{}".format(str(uuid.uuid4())[0:7])
+        self.maintenance_connection = get_db_connection(self.server['db'],
+                                                        self.server['username'],
+                                                        self.server['db_password'],
+                                                        self.server['host'],
+                                                        self.server['port'])
+        create_database(self.server, self.name)
+        self.connection = get_db_connection(self.name,
+                                            self.server['username'],
+                                            self.server['db_password'],
+                                            self.server['host'],
+                                            self.server['port'])
+        return self.connection, self.name
+
+    def __exit__(self, type, value, traceback):
+        self.connection.close()
+        drop_database(self.maintenance_connection, self.name)
-- 
2.11.0

