Hi,

Please find updated patch for encoding issue.

Apart from encoding issue I have also fixed issue of wrong data was show in
query editor for string types and array string types for databases with
encoding other than utf-8.



-- 
*Harshal Dhumal*
*Software Engineer*

EnterpriseDB India: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

On Fri, Feb 24, 2017 at 4:41 PM, Dave Page <dp...@pgadmin.org> wrote:

> Hi
>
> On Thu, Feb 23, 2017 at 10:34 AM, Harshal Dhumal
> <harshal.dhu...@enterprisedb.com> wrote:
> > Hi,
> >
> > Please find updated patch for unicode issue on python 2.7
> >
> > I have tested with below scenarios for all nodes (except database and
> > Login/Group Role as these are stored in shared catalogs as for now we are
> > not considering encoding issues for these two nodes)
>
> This breaks on my PG 9.4 server - I'm unable to open the Databases
> node. That server has both databases with Unicode names, and databases
> in encodings other than UTF-8.
>
> (hat-tip to George and Atira; it was their feature tests that showed
> up this problem :-) )
>
> 2017-02-24 11:08:26,379: INFO werkzeug: 127.0.0.1 - - [24/Feb/2017
> 11:08:26] "GET /browser/database/nodes/1/1/ HTTP/1.1" 500 -
> Traceback (most recent call last):
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 2000, in __call__
>     return self.wsgi_app(environ, start_response)
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1991, in wsgi_app
>     response = self.make_response(self.handle_exception(e))
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1567, in handle_exception
>     reraise(exc_type, exc_value, tb)
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1988, in wsgi_app
>     response = self.full_dispatch_request()
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1641, in full_dispatch_request
>     rv = self.handle_user_exception(e)
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1544, in handle_user_exception
>     reraise(exc_type, exc_value, tb)
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1639, in full_dispatch_request
>     rv = self.dispatch_request()
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/app.py",
> line 1625, in dispatch_request
>     return self.view_functions[rule.endpoint](**req.view_args)
>   File "/Users/dpage/.virtualenvs/pgadmin4/lib/python2.7/site-
> packages/flask/views.py",
> line 84, in view
>     return self.dispatch_request(*args, **kwargs)
>   File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/utils.py", line
> 235, in dispatch_request
>     return method(*args, **kwargs)
>   File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/databases/__init__.py",
> line 151, in wrapped
>     return f(self, *args, **kwargs)
>   File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/databases/__init__.py",
> line 228, in nodes
>     res = self.get_nodes(gid, sid)
>   File "/Users/dpage/git/pgadmin4/web/pgadmin/browser/server_
> groups/servers/databases/__init__.py",
> line 198, in get_nodes
>     dbname = dbname.decode('utf-8')
>   File "/System/Library/Frameworks/Python.framework/Versions/2.7/
> lib/python2.7/encodings/utf_8.py",
> line 16, in decode
>     return codecs.utf_8_decode(input, errors, True)
> UnicodeEncodeError: 'ascii' codec can't encode characters in position
> 0-5: ordinal not in range(128)
>
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
index 88360dd..4ba9d88 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py
@@ -194,8 +194,6 @@ class DatabaseView(PGChildNodeView):
 
         for row in rset['rows']:
             dbname = row['name']
-            if hasattr(str, 'decode'):
-                dbname = dbname.decode('utf-8')
             if self.manager.db == dbname:
                 connected = True
                 canDrop = canDisConn = False
@@ -253,8 +251,6 @@ class DatabaseView(PGChildNodeView):
 
         for row in rset['rows']:
             db = row['name']
-            if hasattr(str, 'decode'):
-                db = db.decode('utf-8')
             if self.manager.db == db:
                 connected = True
             else:
@@ -905,9 +901,7 @@ class DatabaseView(PGChildNodeView):
         frmtd_variables = parse_variables_from_db(res1['rows'])
         result.update(frmtd_variables)
 
-        sql_header = "-- Database: {0}\n\n-- ".format(result['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+        sql_header = u"-- Database: {0}\n\n-- ".format(result['name'])
 
         sql_header += render_template(
             "/".join([self.template_path, 'delete.sql']),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py
index c9535e7..923706f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py
@@ -502,18 +502,15 @@ class CastView(PGChildNodeView):
          :return:
         """
         data = request.args
-        try:
-            sql, name = self.get_sql(gid, sid, did, data, cid)
-            sql = sql.strip('\n').strip(' ')
-            if sql == '':
-                sql = "--modified SQL"
+        sql, name = self.get_sql(gid, sid, did, data, cid)
+        sql = sql.strip('\n').strip(' ')
+        if sql == '':
+            sql = "--modified SQL"
 
-            return make_json_response(
-                data=sql,
-                status=200
-            )
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        return make_json_response(
+            data=sql,
+            status=200
+        )
 
     def get_sql(self, gid, sid, did, data, cid=None):
         """
@@ -544,13 +541,13 @@ class CastView(PGChildNodeView):
                 "/".join([self.template_path, 'update.sql']),
                 data=data, o_data=old_data
             )
-            return str(sql), data['name'] if 'name' in data else old_data['name']
+            return sql, data['name'] if 'name' in data else old_data['name']
         else:
             if 'srctyp' in data and 'trgtyp' in data:
                 sql = render_template("/".join([self.template_path, 'create.sql']), data=data, conn=self.conn)
             else:
-                return "-- incomplete definition", None
-            return str(sql), data['srctyp'] + "->" + data["trgtyp"]
+                return u"-- incomplete definition", None
+            return sql, data['srctyp'] + "->" + data["trgtyp"]
 
     @check_precondition
     def get_functions(self, gid, sid, did, cid=None):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py
index 9a96224..f47f71c 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/__init__.py
@@ -623,39 +623,33 @@ class EventTriggerView(PGChildNodeView):
         Returns:
 
         """
-        try:
-            sql = render_template("/".join([self.template_path, 'properties.sql']), etid=etid)
-            status, res = self.conn.execute_dict(sql)
-            if not status:
-                return internal_server_error(errormsg=res)
-
-            result = res['rows'][0]
-            result = self._formatter(result)
+        sql = render_template("/".join([self.template_path, 'properties.sql']), etid=etid)
+        status, res = self.conn.execute_dict(sql)
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            sql = render_template("/".join([self.template_path, 'create.sql']), data=result, conn=self.conn)
-            sql += "\n\n"
-            sql += render_template("/".join([self.template_path, 'grant.sql']), data=result, conn=self.conn)
+        result = res['rows'][0]
+        result = self._formatter(result)
 
-            db_sql = render_template("/".join([self.template_path, 'get_db.sql']), did=did)
-            status, db_name = self.conn.execute_scalar(db_sql)
-            if not status:
-                return internal_server_error(errormsg=db_name)
+        sql = render_template("/".join([self.template_path, 'create.sql']), data=result, conn=self.conn)
+        sql += "\n\n"
+        sql += render_template("/".join([self.template_path, 'grant.sql']), data=result, conn=self.conn)
 
-            sql_header = "-- Event Trigger: {0} on database {1}\n\n-- ".format(result['name'], db_name)
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+        db_sql = render_template("/".join([self.template_path, 'get_db.sql']), did=did)
+        status, db_name = self.conn.execute_scalar(db_sql)
+        if not status:
+            return internal_server_error(errormsg=db_name)
 
-            sql_header += render_template(
-                "/".join([self.template_path, 'delete.sql']),
-                name=result['name'], )
-            sql_header += "\n"
+        sql_header = u"-- Event Trigger: {0} on database {1}\n\n-- ".format(result['name'], db_name)
 
-            sql = sql_header + sql
+        sql_header += render_template(
+            "/".join([self.template_path, 'delete.sql']),
+            name=result['name'], )
+        sql_header += "\n"
 
-            return ajax_response(response=sql)
+        sql = sql_header + sql
 
-        except Exception as e:
-            return ajax_response(response=str(e))
+        return ajax_response(response=sql)
 
     @check_precondition
     def get_event_funcs(self, gid, sid, did, etid=None):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
index 9f2191d..fdfdcba 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py
@@ -682,15 +682,12 @@ class ForeignDataWrapperView(PGChildNodeView):
                               )
         sql += "\n"
 
-        sql_header = """-- Foreign Data Wrapper: {0}
+        sql_header = u"""-- Foreign Data Wrapper: {0}
 
 -- DROP FOREIGN DATA WRAPPER {0}
 
 """.format(res['rows'][0]['name'])
 
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
-
         sql = sql_header + sql
 
         return ajax_response(response=sql.strip('\n'))
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py
index e73cf29..245c343 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py
@@ -703,13 +703,11 @@ class ForeignServerView(PGChildNodeView):
                               conn=self.conn)
         sql += "\n"
 
-        sql_header = """-- Foreign Server: {0}
+        sql_header = u"""-- Foreign Server: {0}
 
 -- DROP SERVER {0}
 
 """.format(res['rows'][0]['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
 
         sql = sql_header + sql
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py
index 638887f..f3badf6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mapping/__init__.py
@@ -709,13 +709,11 @@ class UserMappingView(PGChildNodeView):
                               conn=self.conn)
         sql += "\n"
 
-        sql_header = """-- User Mapping : {0}
+        sql_header = u"""-- User Mapping : {0}
 
 -- DROP USER MAPPING FOR {0} SERVER {1}
 
 """.format(res['rows'][0]['name'], fdw_data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
 
         sql = sql_header + sql
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
index 3daedf3..4789752 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
@@ -805,9 +805,7 @@ It may have been removed by another user.
             _=gettext, data=data, conn=self.conn
         )
 
-        sql_header = "-- SCHEMA: {0}\n\n-- ".format(data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+        sql_header = u"-- SCHEMA: {0}\n\n-- ".format(data['name'])
 
         # drop schema
         sql_header += render_template(
@@ -991,14 +989,12 @@ It may have been removed by another user.
             _=gettext, data=old_data, conn=self.conn
         )
 
-        sql_header = """
+        sql_header = u"""
 -- CATALOG: {0}
 
 -- DROP SCHEMA {0};(
 
 """.format(old_data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
 
         SQL = sql_header + SQL
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
index 76b7018..ea47797 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py
@@ -650,9 +650,8 @@ class CollationView(PGChildNodeView):
                                         'create.sql']),
                               data=data, conn=self.conn)
 
-        sql_header = "-- Collation: {0};\n\n-- ".format(data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+        sql_header = u"-- Collation: {0};\n\n-- ".format(data['name'])
+
         sql_header += render_template("/".join([self.template_path,
                                                 'delete.sql']),
                                       name=data['name'])
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
index 3f7c94f..1827644 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py
@@ -699,14 +699,11 @@ AND relkind != 'c'))"""
         SQL = render_template("/".join([self.template_path,
                                         'create.sql']), data=data)
 
-        sql_header = """-- DOMAIN: {0}
+        sql_header = u"""-- DOMAIN: {0}
 
 -- DROP DOMAIN {0};
 
-""".format(data['basensp'] + '.' + data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
-
+""".format(self.qtIdent(self.conn, data['basensp'], data['name']))
         SQL = sql_header + SQL
 
         return ajax_response(response=SQL.strip('\n'))
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py
index c187ccc..b612cbe 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py
@@ -601,13 +601,12 @@ class DomainConstraintView(PGChildNodeView):
                                         'create.sql']),
                               data=data, domain=domain, schema=schema)
 
-        sql_header = """-- CHECK: {1}.{0}
+        sql_header = u"""-- CHECK: {1}.{0}
 
 -- ALTER DOMAIN {1} DROP CONSTRAINT {0};
 
-""".format(data['name'], schema + '.' + domain)
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+""".format(self.qtIdent(self.conn, data['name']),
+           self.qtIdent(self.conn, schema, domain))
 
         SQL = sql_header + SQL
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
index eb82216..8de1fac 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py
@@ -821,13 +821,11 @@ shifted to the another schema.
         SQL = render_template("/".join([self.template_path,
                                         'create.sql']), data=data)
 
-        sql_header = """-- {0}: {1}
+        sql_header = u"""-- FOREIGN TABLE: {0}
 
--- DROP {0} {1};
+-- DROP FOREIGN TABLE {0};
 
-""".format('FOREIGN TABLE', data['basensp'] + "." + data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+""".format(self.qtIdent(self.conn, data['basensp'], data['name']))
 
         SQL = sql_header + SQL
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
index cb0f828..4a27555 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py
@@ -594,18 +594,16 @@ class FtsConfigurationView(PGChildNodeView):
                 data[k] = json.loads(v, encoding='utf-8')
             except ValueError:
                 data[k] = v
-        try:
-            # Fetch sql query for modified data
-            SQL, name = self.get_sql(gid, sid, did, scid, data, cfgid)
-            if SQL == '':
-                SQL = "-- No change"
 
-            return make_json_response(
-                data=SQL,
-                status=200
-                )
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        # Fetch sql query for modified data
+        SQL, name = self.get_sql(gid, sid, did, scid, data, cfgid)
+        if SQL == '':
+            SQL = "-- No change"
+
+        return make_json_response(
+            data=SQL,
+            status=200
+            )
 
     def get_sql(self, gid, sid, did, scid, data, cfgid=None):
         """
@@ -668,7 +666,7 @@ class FtsConfigurationView(PGChildNodeView):
                 data=new_data, o_data=old_data
             )
             # Fetch sql query for modified data
-            return str(sql.strip('\n')), data['name'] if 'name' in data else old_data['name']
+            return sql.strip('\n'), data['name'] if 'name' in data else old_data['name']
         else:
             # Fetch schema name from schema oid
             sql = render_template(
@@ -692,8 +690,8 @@ class FtsConfigurationView(PGChildNodeView):
                                       conn=self.conn
                                       )
             else:
-                sql = "-- incomplete definition"
-            return str(sql.strip('\n')), data['name']
+                sql = u"-- incomplete definition"
+            return sql.strip('\n'), data['name']
 
     @check_precondition
     def parsers(self, gid, sid, did, scid):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
index ebbd819..fe3f2db 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py
@@ -579,18 +579,15 @@ class FtsDictionaryView(PGChildNodeView):
             except ValueError:
                 data[k] = v
 
-        try:
-            # Fetch sql query for modified data
-            SQL, name = self.get_sql(gid, sid, did, scid, data, dcid)
-            if SQL == '':
-                SQL = "--modified SQL"
+        # Fetch sql query for modified data
+        SQL, name = self.get_sql(gid, sid, did, scid, data, dcid)
+        if SQL == '':
+            SQL = "--modified SQL"
 
-            return make_json_response(
-                data=SQL,
-                status=200
-                )
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        return make_json_response(
+            data=SQL,
+            status=200
+            )
 
     def get_sql(self, gid, sid, did, scid, data, dcid=None):
         """
@@ -653,7 +650,7 @@ class FtsDictionaryView(PGChildNodeView):
                 data=new_data, o_data=old_data
             )
             # Fetch sql query for modified data
-            return str(sql.strip('\n')), data['name'] if 'name' in data else old_data['name']
+            return sql.strip('\n'), data['name'] if 'name' in data else old_data['name']
         else:
             # Fetch schema name from schema oid
             sql = render_template("/".join([self.template_path, 'schema.sql']),
@@ -676,8 +673,8 @@ class FtsDictionaryView(PGChildNodeView):
                                       conn=self.conn
                                       )
             else:
-                sql = "-- incomplete definition"
-            return str(sql.strip('\n')), data['name']
+                sql = u"-- incomplete definition"
+            return sql.strip('\n'), data['name']
 
     @check_precondition
     def fetch_templates(self, gid, sid, did, scid):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionary/sql/default/sql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionary/sql/default/sql.sql
index 6a36829..27095d8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionary/sql/default/sql.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/templates/fts_dictionary/sql/default/sql.sql
@@ -5,9 +5,9 @@ SELECT
 FROM
     (
     SELECT
-        E'-- Text Search Dictionary: ' || nspname || E'.' || dict.dictname ||
-        E'\n\n-- DROP TEXT SEARCH DICTIONARY ' || nspname || E'.' || dict.dictname ||
-        E'\n\nCREATE TEXT SEARCH DICTIONARY ' || nspname || E'.' ||  dict.dictname || E' (\n' ||
+        E'-- Text Search Dictionary: ' || quote_ident(nspname) || E'.' || quote_ident(dict.dictname) ||
+        E'\n\n-- DROP TEXT SEARCH DICTIONARY ' || quote_ident(nspname) || E'.' || quote_ident(dict.dictname) ||
+        E'\n\nCREATE TEXT SEARCH DICTIONARY ' || quote_ident(nspname) || E'.' || quote_ident(dict.dictname) || E' (\n' ||
         E'\tTEMPLATE = ' || template ||
         CASE
             WHEN dict.dictinitoption IS NOT NULL THEN E',\n\t' || dict.dictinitoption
@@ -16,7 +16,7 @@ FROM
         E'\n);' ||
         CASE
             WHEN description IS NOT NULL THEN
-                E'\n\nCOMMENT ON TEXT SEARCH DICTIONARY ' || nspname || E'.' || dict.dictname ||
+                E'\n\nCOMMENT ON TEXT SEARCH DICTIONARY ' || quote_ident(nspname) || E'.' || quote_ident(dict.dictname) ||
                 E' IS ' || pg_catalog.quote_literal(description) || E';'
             ELSE ''  END as sql
     FROM
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py
index 67c46a6..16296f7 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/__init__.py
@@ -513,18 +513,16 @@ class FtsParserView(PGChildNodeView):
         """
         data = request.args
         # Fetch sql query for modified data
-        try:
-            # Fetch sql query for modified data
-            SQL, name = self.get_sql(gid, sid, did, scid, data, pid)
-            if SQL == '':
-                SQL = "--modified SQL"
 
-            return make_json_response(
-                data=SQL,
-                status=200
-                )
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        # Fetch sql query for modified data
+        SQL, name = self.get_sql(gid, sid, did, scid, data, pid)
+        if SQL == '':
+            SQL = "--modified SQL"
+
+        return make_json_response(
+            data=SQL,
+            status=200
+            )
 
     def get_sql(self, gid, sid, did, scid, data, pid=None):
         """
@@ -587,7 +585,7 @@ class FtsParserView(PGChildNodeView):
                 o_data=old_data
             )
             # Fetch sql query for modified data
-            return str(sql.strip('\n')), data['name'] if 'name' in data else old_data['name']
+            return sql.strip('\n'), data['name'] if 'name' in data else old_data['name']
         else:
             # Fetch schema name from schema oid
             sql = render_template(
@@ -616,7 +614,7 @@ class FtsParserView(PGChildNodeView):
                 )
             else:
                 sql = "-- incomplete definition"
-        return str(sql.strip('\n')), data['name']
+        return sql.strip('\n'), data['name']
 
     @check_precondition
     def start_functions(self, gid, sid, did, scid):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/templates/fts_parser/sql/default/sql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/templates/fts_parser/sql/default/sql.sql
index da16244..71bb902 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/templates/fts_parser/sql/default/sql.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parser/templates/fts_parser/sql/default/sql.sql
@@ -5,9 +5,9 @@ SELECT
 FROM
     (
     SELECT
-        E'-- Text Search Parser: ' || nspname || E'.' || prs.prsname ||
-        E'\n\n-- DROP TEXT SEARCH PARSER ' || nspname || E'.' || prs.prsname ||
-        E'\n\nCREATE TEXT SEARCH PARSER ' || nspname || E'.' ||  prs.prsname || E' (\n' ||
+        E'-- Text Search Parser: ' || quote_ident(nspname) || E'.' || quote_ident(prs.prsname) ||
+        E'\n\n-- DROP TEXT SEARCH PARSER ' || quote_ident(nspname) || E'.' || quote_ident(prs.prsname) ||
+        E'\n\nCREATE TEXT SEARCH PARSER ' || quote_ident(nspname) || E'.' || quote_ident(prs.prsname) || E' (\n' ||
         E'    START = ' || prs.prsstart || E',\n' ||
         E'    GETTOKEN = ' || prs.prstoken || E',\n' ||
         E'    END = ' || prs.prsend || E',\n' ||
@@ -17,7 +17,7 @@ FROM
             ELSE '' END || E'\n);' ||
         CASE
             WHEN description IS NOT NULL THEN
-                E'\n\nCOMMENT ON TEXT SEARCH PARSER ' || nspname || E'.' || prs.prsname ||
+                E'\n\nCOMMENT ON TEXT SEARCH PARSER ' || quote_ident(nspname) || E'.' || quote_ident(prs.prsname) ||
                 E' IS ' || pg_catalog.quote_literal(description) || E';'
             ELSE ''  END as sql
     FROM
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
index 28d0df3..034bcdc 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py
@@ -275,7 +275,7 @@ class FtsTemplateView(PGChildNodeView):
                 status=200
             )
         return gone(
-            _("Could not the requested FTS template.")
+            gettext("Could not the requested FTS template.")
         )
 
     @check_precondition
@@ -547,7 +547,7 @@ class FtsTemplateView(PGChildNodeView):
                 data=new_data, o_data=old_data
             )
             # Fetch sql query for modified data
-            return str(sql.strip('\n')), data['name'] if 'name' in data else old_data['name']
+            return sql.strip('\n'), data['name'] if 'name' in data else old_data['name']
         else:
             # Fetch schema name from schema oid
             sql = render_template("/".join([self.template_path, 'schema.sql']),
@@ -570,8 +570,8 @@ class FtsTemplateView(PGChildNodeView):
                                       conn=self.conn
                                       )
             else:
-                sql = "-- incomplete definition"
-            return str(sql.strip('\n')), data['name']
+                sql = u"-- incomplete definition"
+            return sql.strip('\n'), data['name']
 
     @check_precondition
     def get_lexize(self, gid, sid, did, scid, tid=None):
@@ -649,7 +649,7 @@ class FtsTemplateView(PGChildNodeView):
         status, res = self.conn.execute_scalar(sql)
         if not status:
             return internal_server_error(
-                _(
+                gettext(
                     "Could not generate reversed engineered Query for the FTS Template.\n{0}").format(
                     res
                 )
@@ -657,7 +657,7 @@ class FtsTemplateView(PGChildNodeView):
 
         if res is None:
             return gone(
-                _(
+                gettext(
                     "Could not generate reversed engineered Query for FTS Template node.")
             )
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_template/sql/default/sql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_template/sql/default/sql.sql
index 6661078..54d7235 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_template/sql/default/sql.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_template/sql/default/sql.sql
@@ -4,16 +4,16 @@ SELECT
 FROM
     (
     SELECT
-        E'-- Text Search Template: ' || nspname || E'.' || tmpl.tmplname ||
-        E'\n\n-- DROP TEXT SEARCH TEMPLATE ' || nspname || E'.' || tmpl.tmplname ||
-        E'\n\nCREATE TEXT SEARCH TEMPLATE ' || nspname || E'.' ||  tmpl.tmplname || E' (\n' ||
+        E'-- Text Search Template: ' || quote_ident(nspname) || E'.' || quote_ident(tmpl.tmplname) ||
+        E'\n\n-- DROP TEXT SEARCH TEMPLATE ' || quote_ident(nspname) || E'.' || quote_ident(tmpl.tmplname) ||
+        E'\n\nCREATE TEXT SEARCH TEMPLATE ' || quote_ident(nspname) || E'.' || quote_ident(tmpl.tmplname) || E' (\n' ||
         CASE
             WHEN tmpl.tmplinit != '-'::regclass THEN E'    INIT = ' || tmpl.tmplinit || E',\n'
             ELSE '' END ||
         E'    LEXIZE = ' || tmpl.tmpllexize || E'\n);' ||
         CASE
             WHEN a.description IS NOT NULL THEN
-                E'\n\nCOMMENT ON TEXT SEARCH TEMPLATE ' || nspname || E'.' || tmpl.tmplname ||
+                E'\n\nCOMMENT ON TEXT SEARCH TEMPLATE ' || quote_ident(nspname) || E'.' || quote_ident(tmpl.tmplname) ||
                 E' IS ' || pg_catalog.quote_literal(description) || E';'
             ELSE ''  END as sql
 FROM
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
index ebf9a6a..b9895ca 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
@@ -955,13 +955,6 @@ class FunctionView(PGChildNodeView, DataTypeReader):
             if 'acl' in resp_data:
                 resp_data['acl'] = parse_priv_to_db(resp_data['acl'], ['X'])
 
-            # generate function signature
-            header_func_name = '{0}.{1}({2})'.format(
-                resp_data['pronamespace'],
-                resp_data['proname'],
-                resp_data['proargtypenames']
-            )
-
             # Generate sql for "SQL panel"
             # func_def is procedure signature with default arguments
             # query_for - To distinguish the type of call
@@ -982,13 +975,6 @@ class FunctionView(PGChildNodeView, DataTypeReader):
             if 'acl' in resp_data:
                 resp_data['acl'] = parse_priv_to_db(resp_data['acl'], ['X'])
 
-            # generate function signature
-            header_func_name = '{0}.{1}({2})'.format(
-                resp_data['pronamespace'],
-                resp_data['proname'],
-                resp_data['proargtypenames']
-            )
-
             SQL = render_template("/".join([self.sql_template_path,
                                             'get_definition.sql']
                                            ), data=resp_data,
@@ -999,17 +985,7 @@ class FunctionView(PGChildNodeView, DataTypeReader):
                 return internal_server_error(errormsg=res)
 
             # Add newline and tab before each argument to format
-            name_with_default_args =  res['rows'][0]['name_with_default_args'].replace(', ', ',\r\t').replace('(', '(\r\t')
-
-            if hasattr(str, 'decode'):
-                if resp_data['prosrc']:
-                    resp_data['prosrc'] = resp_data['prosrc'].decode(
-                        'utf-8'
-                    )
-                if resp_data['prosrc_c']:
-                    resp_data['prosrc_c'] = resp_data['prosrc_c'].decode(
-                        'utf-8'
-                    )
+            name_with_default_args = res['rows'][0]['name_with_default_args'].replace(', ', ',\r\t').replace('(', '(\r\t')
 
             # Generate sql for "SQL panel"
             # func_def is function signature with default arguments
@@ -1020,13 +996,16 @@ class FunctionView(PGChildNodeView, DataTypeReader):
                                        func_def=name_with_default_args,
                                        query_for="sql_panel")
 
-        sql_header = """-- {0}: {1}
+        sql_header = u"""-- {0}: {1}{2}
 
--- DROP {0} {1};
+-- DROP {0} {1}{2};
 
-""".format(object_type.upper(), header_func_name)
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+""".format(object_type.upper(),
+           self.qtIdent(
+               self.conn,
+               resp_data['pronamespace'],
+               resp_data['proname']),
+           resp_data['proargtypenames'])
 
         SQL = sql_header + func_def
         SQL = re.sub('\n{2,}', '\n\n', SQL)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
index da90fed..da0cb4e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py
@@ -606,11 +606,9 @@ class PackageView(PGChildNodeView):
             sql, name = self.getSQL(gid, sid, did, result, scid)
             sql = sql.strip('\n').strip(' ')
 
-            sql_header = "-- Package: {}\n\n-- ".format(
+            sql_header = u"-- Package: {}\n\n-- ".format(
                 self.qtIdent(self.conn, self.schema, result['name'])
             )
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
 
             sql_header += render_template(
                 "/".join([self.template_path, 'delete.sql']),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
index d4d14e0..c1a0fe1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py
@@ -542,11 +542,9 @@ It may have been removed by another user or moved to another schema.
         if not status:
             return internal_server_error(errormsg=res)
 
-        sql = "-- Package {}: {}".format(
+        sql = u"-- Package {}: {}".format(
             'Function' if self.node_type == 'edbfunc' else 'Procedure',
             name)
-        if hasattr(str, 'decode'):
-            sql = sql.decode('utf-8')
         if body != '':
             sql += "\n\n"
             sql += body
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
index a955f30..4de84e9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbvars/__init__.py
@@ -317,11 +317,9 @@ class EdbVarView(PGChildNodeView, DataTypeReader):
             return internal_server_error(errormsg=res)
         var = res['rows'][0]
 
-        sql = "-- Package Variable: {}".format(var['name'])
-        sql += "\n\n"
-        sql += "{} {};".format(var['name'], var['datatype'])
-        if hasattr(str, 'decode'):
-            sql = sql.decode('utf-8')
+        sql = u"-- Package Variable: {}".format(var['name'])
+        sql += u"\n\n"
+        sql += u"{} {};".format(var['name'], var['datatype'])
 
         return ajax_response(response=sql)
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
index 690c39e..5e547ea 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
@@ -1732,18 +1732,15 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
             except (ValueError, TypeError, KeyError):
                 data[k] = v
 
-        try:
-            SQL, name = self.get_sql(did, scid, tid, data)
-            SQL = re.sub('\n{2,}', '\n\n', SQL)
-            SQL = SQL.strip('\n')
-            if SQL == '':
-                SQL = "--modified SQL"
-            return make_json_response(
-                data=SQL,
-                status=200
-            )
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        SQL, name = self.get_sql(did, scid, tid, data)
+        SQL = re.sub('\n{2,}', '\n\n', SQL)
+        SQL = SQL.strip('\n')
+        if SQL == '':
+            SQL = "--modified SQL"
+        return make_json_response(
+            data=SQL,
+            status=200
+        )
 
     def get_index_constraint_sql(self, did, tid, data):
         """
@@ -2025,7 +2022,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
         else:
             return None
 
-    def get_exclusion_constraint_sql(self, tid, data):
+    def get_exclusion_constraint_sql(self, did, tid, data):
         """
          Args:
            tid: Table ID
@@ -2060,7 +2057,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
                     properties_sql = render_template("/".join(
                         [self.exclusion_constraint_template_path, 'properties.sql']),
-                        tid=tid, cid=c['oid'])
+                        did=did, tid=tid, cid=c['oid'])
                     status, res = self.conn.execute_dict(properties_sql)
                     if not status:
                         return internal_server_error(errormsg=res)
@@ -2097,7 +2094,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
         if len(sql) > 0:
             # Join all the sql(s) as single string
-            return '\n\n'.join(sql)
+            return u'\n\n'.join(sql)
         else:
             return None
 
@@ -2277,7 +2274,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
                 SQL += '\n' + check_constraint_sql
 
             # Check if exclusion constraint(s) is/are added/changed/deleted
-            exclusion_constraint_sql = self.get_exclusion_constraint_sql(tid, data)
+            exclusion_constraint_sql = self.get_exclusion_constraint_sql(did, tid, data)
             # If we have check constraint sql then ad it in main sql
             if exclusion_constraint_sql is not None:
                 SQL += '\n' + exclusion_constraint_sql
@@ -2574,9 +2571,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
             # Push as string
             data['cols'] = ', '.join(cols)
 
-            sql_header = "\n-- Index: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+            sql_header = u"\n-- Index: {0}\n\n-- ".format(data['name'])
 
             sql_header += render_template("/".join([self.index_template_path,
                                                     'delete.sql']),
@@ -2646,9 +2641,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
             data = trigger_definition(data)
 
-            sql_header = "\n-- Trigger: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+            sql_header = u"\n-- Trigger: {0}\n\n-- ".format(data['name'])
 
             sql_header += render_template("/".join([self.trigger_template_path,
                                                     'delete.sql']),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py
index caf8ddc..e3c910f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py
@@ -706,9 +706,7 @@ class CheckConstraintView(PGChildNodeView):
                                         'create.sql']),
                               data=data)
 
-        sql_header = "-- Constraint: {0}\n\n-- ".format(data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+        sql_header = u"-- Constraint: {0}\n\n-- ".format(data['name'])
 
         sql_header += render_template(
             "/".join([self.template_path, 'delete.sql']),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py
index 036dbc4..274629f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py
@@ -868,9 +868,7 @@ class ExclusionConstraintView(PGChildNodeView):
             SQL = render_template(
                 "/".join([self.template_path, 'create.sql']), data=data)
 
-            sql_header = "-- Constraint: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+            sql_header = u"-- Constraint: {0}\n\n-- ".format(data['name'])
 
             sql_header += render_template(
                 "/".join([self.template_path, 'delete.sql']),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py
index 3f10976..edd99df 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/__init__.py
@@ -918,66 +918,61 @@ class ForeignKeyConstraintView(PGChildNodeView):
         Returns:
 
         """
-        try:
-            SQL = render_template(
-                "/".join([self.template_path, 'properties.sql']),
-                tid=tid, conn=self.conn, cid=fkid)
-            status, res = self.conn.execute_dict(SQL)
-            if not status:
-                return internal_server_error(errormsg=res)
 
-            data = res['rows'][0]
-            data['schema'] = self.schema
-            data['table'] = self.table
+        SQL = render_template(
+            "/".join([self.template_path, 'properties.sql']),
+            tid=tid, conn=self.conn, cid=fkid)
+        status, res = self.conn.execute_dict(SQL)
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            sql = render_template("/".join([self.template_path,
-                                            'get_constraint_cols.sql']),
-                                  tid=tid,
-                                  keys=zip(data['confkey'], data['conkey']),
-                                  confrelid=data['confrelid'])
+        data = res['rows'][0]
+        data['schema'] = self.schema
+        data['table'] = self.table
 
-            status, res = self.conn.execute_dict(sql)
+        sql = render_template("/".join([self.template_path,
+                                        'get_constraint_cols.sql']),
+                              tid=tid,
+                              keys=zip(data['confkey'], data['conkey']),
+                              confrelid=data['confrelid'])
 
-            if not status:
-                return internal_server_error(errormsg=res)
+        status, res = self.conn.execute_dict(sql)
 
-            columns = []
-            for row in res['rows']:
-                columns.append({"local_column": row['conattname'],
-                                "references": data['confrelid'],
-                                "referenced": row['confattname']})
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            data['columns'] = columns
+        columns = []
+        for row in res['rows']:
+            columns.append({"local_column": row['conattname'],
+                            "references": data['confrelid'],
+                            "referenced": row['confattname']})
 
-            SQL = render_template("/".join([self.template_path,
-                                            'get_parent.sql']),
-                                  tid=data['columns'][0]['references'])
-            status, res = self.conn.execute_2darray(SQL)
+        data['columns'] = columns
 
-            if not status:
-                return internal_server_error(errormsg=res)
+        SQL = render_template("/".join([self.template_path,
+                                        'get_parent.sql']),
+                              tid=data['columns'][0]['references'])
+        status, res = self.conn.execute_2darray(SQL)
 
-            data['remote_schema'] = res['rows'][0]['schema']
-            data['remote_table'] = res['rows'][0]['table']
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            SQL = render_template(
-                "/".join([self.template_path, 'create.sql']), data=data)
+        data['remote_schema'] = res['rows'][0]['schema']
+        data['remote_table'] = res['rows'][0]['table']
 
-            sql_header = "-- Constraint: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+        SQL = render_template(
+            "/".join([self.template_path, 'create.sql']), data=data)
 
-            sql_header += render_template(
-                "/".join([self.template_path, 'delete.sql']),
-                data=data)
-            sql_header += "\n"
+        sql_header = u"-- Constraint: {0}\n\n-- ".format(data['name'])
 
-            SQL = sql_header + SQL
+        sql_header += render_template(
+            "/".join([self.template_path, 'delete.sql']),
+            data=data)
+        sql_header += "\n"
 
-            return ajax_response(response=SQL)
+        SQL = sql_header + SQL
 
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        return ajax_response(response=SQL)
 
     @check_precondition
     def dependents(self, gid, sid, did, scid, tid, fkid=None):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py
index d337119..519742a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/__init__.py
@@ -873,57 +873,52 @@ class IndexConstraintView(PGChildNodeView):
         Returns:
 
         """
-        try:
-            SQL = render_template(
-                "/".join([self.template_path, 'properties.sql']),
-                did=did,
-                tid=tid,
-                conn=self.conn,
-                cid=cid,
-                constraint_type=self.constraint_type)
-            status, res = self.conn.execute_dict(SQL)
-            if not status:
-                return internal_server_error(errormsg=res)
 
-            data = res['rows'][0]
-            data['schema'] = self.schema
-            data['table'] = self.table
+        SQL = render_template(
+            "/".join([self.template_path, 'properties.sql']),
+            did=did,
+            tid=tid,
+            conn=self.conn,
+            cid=cid,
+            constraint_type=self.constraint_type)
+        status, res = self.conn.execute_dict(SQL)
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            sql = render_template(
-                "/".join([self.template_path, 'get_constraint_cols.sql']),
-                cid=cid, colcnt=data['indnatts'])
+        data = res['rows'][0]
+        data['schema'] = self.schema
+        data['table'] = self.table
 
-            status, res = self.conn.execute_dict(sql)
+        sql = render_template(
+            "/".join([self.template_path, 'get_constraint_cols.sql']),
+            cid=cid, colcnt=data['indnatts'])
 
-            if not status:
-                return internal_server_error(errormsg=res)
+        status, res = self.conn.execute_dict(sql)
 
-            columns = []
-            for row in res['rows']:
-                columns.append({"column": row['column'].strip('"')})
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            data['columns'] = columns
+        columns = []
+        for row in res['rows']:
+            columns.append({"column": row['column'].strip('"')})
 
-            SQL = render_template(
-                "/".join([self.template_path, 'create.sql']),
-                data=data,
-                constraint_name=self.constraint_name)
+        data['columns'] = columns
 
-            sql_header = "-- Constraint: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+        SQL = render_template(
+            "/".join([self.template_path, 'create.sql']),
+            data=data,
+            constraint_name=self.constraint_name)
 
-            sql_header += render_template(
-                "/".join([self.template_path, 'delete.sql']),
-                data=data)
-            sql_header += "\n"
+        sql_header = u"-- Constraint: {0}\n\n-- ".format(data['name'])
 
-            SQL = sql_header + SQL
+        sql_header += render_template(
+            "/".join([self.template_path, 'delete.sql']),
+            data=data)
+        sql_header += "\n"
 
-            return ajax_response(response=SQL)
+        SQL = sql_header + SQL
 
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        return ajax_response(response=SQL)
 
     @check_precondition
     def statistics(self, gid, sid, did, scid, tid, cid):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
index 4403cd8..04f9b22 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/indexes/__init__.py
@@ -839,40 +839,35 @@ class IndexesView(PGChildNodeView):
            tid: Table ID
            idx: Index ID
         """
-        try:
-            SQL = render_template("/".join([self.template_path,
-                                            'properties.sql']),
-                                  did=did, tid=tid, idx=idx,
-                                  datlastsysoid=self.datlastsysoid)
 
-            status, res = self.conn.execute_dict(SQL)
-            if not status:
-                return internal_server_error(errormsg=res)
+        SQL = render_template("/".join([self.template_path,
+                                        'properties.sql']),
+                              did=did, tid=tid, idx=idx,
+                              datlastsysoid=self.datlastsysoid)
 
-            data = dict(res['rows'][0])
-            # Adding parent into data dict, will be using it while creating sql
-            data['schema'] = self.schema
-            data['table'] = self.table
+        status, res = self.conn.execute_dict(SQL)
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            # Add column details for current index
-            data = self._column_details(idx, data)
+        data = dict(res['rows'][0])
+        # Adding parent into data dict, will be using it while creating sql
+        data['schema'] = self.schema
+        data['table'] = self.table
 
-            SQL, name = self.get_sql(did, scid, tid, None, data)
+        # Add column details for current index
+        data = self._column_details(idx, data)
 
-            sql_header = "-- Index: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+        SQL, name = self.get_sql(did, scid, tid, None, data)
 
-            sql_header += render_template("/".join([self.template_path,
-                                                    'delete.sql']),
-                                          data=data, conn=self.conn)
+        sql_header = u"-- Index: {0}\n\n-- ".format(data['name'])
 
-            SQL = sql_header + '\n\n' + SQL
+        sql_header += render_template("/".join([self.template_path,
+                                                'delete.sql']),
+                                      data=data, conn=self.conn)
 
-            return ajax_response(response=SQL)
+        SQL = sql_header + '\n\n' + SQL
 
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        return ajax_response(response=SQL)
 
     @check_precondition
     def dependents(self, gid, sid, did, scid, tid, idx):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/create.sql
index fad2c7a..88bd6e5 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/create.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/rules/sql/create.sql
@@ -1,8 +1,8 @@
 {# ============Create Rule============= #}
 {% if display_comments %}
--- Rule: {{ data.name }} ON {{ conn|qtIdent(data.schema, data.name) }}
+-- Rule: {{ conn|qtIdent(data.name) }} ON {{ conn|qtIdent(data.schema, data.name) }}
 
--- DROP Rule {{ data.name }} ON {{ conn|qtIdent(data.schema, data.name) }};
+-- DROP Rule {{ conn|qtIdent(data.name) }} ON {{ conn|qtIdent(data.schema, data.name) }};
 
 {% endif %}
 {% if data.name and data.schema and data.view %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
index fc77011..3238166 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/__init__.py
@@ -526,7 +526,7 @@ class TriggerView(PGChildNodeView):
         Returns:
             Formated arguments for function
         """
-        formatted_args = ["'{0}'".format(arg) for arg in args]
+        formatted_args = ["{0}".format(arg) for arg in args]
         return ', '.join(formatted_args)
 
 
@@ -889,56 +889,51 @@ class TriggerView(PGChildNodeView):
            tid: Table ID
            trid: Trigger ID
         """
-        try:
-            SQL = render_template("/".join([self.template_path,
-                                            'properties.sql']),
-                                  tid=tid, trid=trid,
-                                  datlastsysoid=self.datlastsysoid)
 
-            status, res = self.conn.execute_dict(SQL)
-            if not status:
-                return internal_server_error(errormsg=res)
+        SQL = render_template("/".join([self.template_path,
+                                        'properties.sql']),
+                              tid=tid, trid=trid,
+                              datlastsysoid=self.datlastsysoid)
 
-            data = dict(res['rows'][0])
-            # Adding parent into data dict, will be using it while creating sql
-            data['schema'] = self.schema
-            data['table'] = self.table
+        status, res = self.conn.execute_dict(SQL)
+        if not status:
+            return internal_server_error(errormsg=res)
 
-            data = self.get_trigger_function_schema(data)
+        data = dict(res['rows'][0])
+        # Adding parent into data dict, will be using it while creating sql
+        data['schema'] = self.schema
+        data['table'] = self.table
 
-            if len(data['custom_tgargs']) > 1:
-                # We know that trigger has more than 1 argument, let's join them
-                data['tgargs'] = self._format_args(data['custom_tgargs'])
+        data = self.get_trigger_function_schema(data)
 
-            if len(data['tgattr']) > 1:
-                columns = ', '.join(data['tgattr'].split(' '))
-                data['columns'] = self._column_details(tid, columns)
+        if len(data['custom_tgargs']) > 1:
+            # We know that trigger has more than 1 argument, let's join them
+            data['tgargs'] = self._format_args(data['custom_tgargs'])
 
-            data = self._trigger_definition(data)
+        if len(data['tgattr']) > 1:
+            columns = ', '.join(data['tgattr'].split(' '))
+            data['columns'] = self._column_details(tid, columns)
 
-            SQL, name = self.get_sql(scid, tid, None, data)
+        data = self._trigger_definition(data)
 
-            sql_header = "-- Trigger: {0}\n\n-- ".format(data['name'])
-            if hasattr(str, 'decode'):
-                sql_header = sql_header.decode('utf-8')
+        SQL, name = self.get_sql(scid, tid, None, data)
 
-            sql_header += render_template("/".join([self.template_path,
-                                                    'delete.sql']),
-                                          data=data, conn=self.conn)
+        sql_header = u"-- Trigger: {0}\n\n-- ".format(data['name'])
 
-            SQL = sql_header + '\n\n' + SQL.strip('\n')
+        sql_header += render_template("/".join([self.template_path,
+                                                'delete.sql']),
+                                      data=data, conn=self.conn)
 
-            # If trigger is disbaled then add sql code for the same
-            if not data['is_enable_trigger']:
-                SQL += '\n\n'
-                SQL += render_template("/".join([self.template_path,
-                                                 'enable_disable_trigger.sql']),
-                                       data=data, conn=self.conn)
+        SQL = sql_header + '\n\n' + SQL.strip('\n')
 
-            return ajax_response(response=SQL)
+        # If trigger is disbaled then add sql code for the same
+        if not data['is_enable_trigger']:
+            SQL += '\n\n'
+            SQL += render_template("/".join([self.template_path,
+                                             'enable_disable_trigger.sql']),
+                                   data=data, conn=self.conn)
 
-        except Exception as e:
-            return internal_server_error(errormsg=str(e))
+        return ajax_response(response=SQL)
 
     @check_precondition
     def enable_disable_trigger(self, gid, sid, did, scid, tid, trid):
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
index 9be270d..c31c8c1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py
@@ -1300,9 +1300,7 @@ class TypeView(PGChildNodeView, DataTypeReader):
         SQL, name = self.get_sql(gid, sid, data, scid, tid=None)
 
         # We are appending headers here for sql panel
-        sql_header = "-- Type: {0}\n\n-- ".format(data['name'])
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
+        sql_header = u"-- Type: {0}\n\n-- ".format(data['name'])
 
         sql_header += render_template("/".join([self.template_path,
                                                 'delete.sql']),
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py
index dc78ab5..c2b7945 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py
@@ -875,8 +875,8 @@ class ViewNode(PGChildNodeView, VacuumSettings):
         for trigger in data['rows']:
             SQL = render_template("/".join(
                 [self.trigger_temp_path, 'sql/#{0}#/properties.sql'.format(self.manager.version)]),
-                tid=trigger['oid'],
-                tgrelid=vid
+                tid=vid,
+                trid=trigger['oid']
             )
 
             status, res = self.conn.execute_dict(SQL)
@@ -894,6 +894,21 @@ class ViewNode(PGChildNodeView, VacuumSettings):
                     trigger['oid'], columns)
             res_rows = trigger_definition(res_rows)
 
+            res_rows['schema'] = res_rows['nspname']
+
+            # It should be relname and not table, but in create.sql
+            # (which is referred from many places) we have used
+            # data.table and not data.relname so compatibility add new key as
+            # table in res_rows.
+            res_rows['table'] = res_rows['relname']
+
+            res_rows['tfunction'] = self.qtIdent(self.conn, res_rows['schema'], res_rows['tfunction'])
+
+            # Format arguments
+            if len(res_rows['custom_tgargs']) > 1:
+                formatted_args = ["{0}".format(arg) for arg in res_rows['custom_tgargs']]
+                res_rows['tgargs'] = ', '.join(formatted_args)
+
             SQL = render_template("/".join(
                 [self.trigger_temp_path, 'sql/#{0}#/create.sql'.format(self.manager.version)]),
                 data=res_rows, display_comments=True)
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py
index 30489d1..b34e145 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py
@@ -534,16 +534,13 @@ class TablespaceView(PGChildNodeView):
             data=old_data, conn=self.conn
         )
 
-        sql_header = """
+        sql_header = u"""
 -- Tablespace: {0}
 
 -- DROP TABLESPACE {0};
 
 """.format(old_data['name'])
 
-        if hasattr(str, 'decode'):
-            sql_header = sql_header.decode('utf-8')
-
         SQL = sql_header + SQL
         SQL = re.sub('\n{2,}', '\n\n', SQL)
         return ajax_response(response=SQL.strip('\n'))
diff --git a/web/pgadmin/utils/driver/psycopg2/__init__.py b/web/pgadmin/utils/driver/psycopg2/__init__.py
index d63a0e1..09224c9 100644
--- a/web/pgadmin/utils/driver/psycopg2/__init__.py
+++ b/web/pgadmin/utils/driver/psycopg2/__init__.py
@@ -26,7 +26,7 @@ from flask import g, current_app, session
 from flask_babel import gettext
 from flask_security import current_user
 from pgadmin.utils.crypto import decrypt
-from psycopg2.extensions import adapt
+from psycopg2.extensions import adapt, encodings
 
 import config
 from pgadmin.model import Server, User
@@ -37,6 +37,8 @@ from .cursor import DictCursor
 
 if sys.version_info < (3,):
     from StringIO import StringIO
+    psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
+    psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
 else:
     from io import StringIO
 
@@ -64,6 +66,50 @@ psycopg2.extensions.register_type(
         'TYPECAST_TO_STRING', psycopg2.STRING)
 )
 
+
+def register_string_typecasters(connection):
+    if connection.encoding != 'UTF8':
+        # In python3 when database encoding is other than utf-8 and client
+        # encoding is set to UNICODE then we need to map data from database
+        # encoding to utf-8.
+        # This is required because when client encoding is set to UNICODE then
+        # psycopg assumes database encoding utf-8 and not the actual encoding.
+        # Not sure whether it's bug or feature in psycopg for python3.
+        if sys.version_info >= (3,):
+            def return_as_unicode(value, cursor):
+                if value is None:
+                    return None
+                # Treat value as byte sequence of database encoding and then
+                # decode it as utf-8 to get correct unicode value.
+                return bytes(
+                    value, encodings[cursor.connection.encoding]
+                ).decode('utf-8')
+
+            unicode_type = psycopg2.extensions.new_type(
+                # "char", name, text, character, character varying
+                (19, 18, 25, 1042, 1043, 0),
+                'UNICODE', return_as_unicode)
+        else:
+            def return_as_unicode(value, cursor):
+                if value is None:
+                    return None
+                # Decode it as utf-8 to get correct unicode value.
+                return value.decode('utf-8')
+
+            unicode_type = psycopg2.extensions.new_type(
+                # "char", name, text, character, character varying
+                (19, 18, 25, 1042, 1043, 0),
+                'UNICODE', return_as_unicode)
+
+        unicode_array_type = psycopg2.extensions.new_array_type(
+            # "char"[], name[], text[], character[], character varying[]
+            (1002, 1003, 1009, 1014, 1015, 0
+             ), 'UNICODEARRAY', unicode_type)
+
+        psycopg2.extensions.register_type(unicode_type)
+        psycopg2.extensions.register_type(unicode_array_type)
+
+
 class Connection(BaseConnection):
     """
     class Connection(object)
@@ -338,6 +384,7 @@ Failed to connect to the database server(#{server_id}) for connection ({conn_id}
             else:
                 self.conn.autocommit = True
 
+        register_string_typecasters(self.conn)
         status = _execute(cur, """
 SET DateStyle=ISO;
 SET client_min_messages=notice;
@@ -540,11 +587,17 @@ WHERE
             query: SQL query to run.
             params: Extra parameters
         """
+
+        if sys.version_info < (3,):
+            if type(query) == unicode:
+                query = query.encode('utf-8')
+        else:
+            query = query.encode('utf-8')
+
         cur.execute(query, params)
         if self.async == 1:
             self._wait(cur.connection)
 
-
     def execute_on_server_as_csv(self, query, params=None, formatted_exception_msg=False, records=2000):
         status, cur = self.__cursor(server_cursor=True)
         self.row_count = 0
@@ -553,11 +606,14 @@ WHERE
             return False, str(cur)
         query_id = random.randint(1, 9999999)
 
+        if sys.version_info < (3,) and type(query) == unicode:
+            query = query.encode('utf-8')
+
         current_app.logger.log(25,
                                u"Execute (with server cursor) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format(
                                    server_id=self.manager.sid,
                                    conn_id=self.conn_id,
-                                   query=query,
+                                   query=query.decode('utf-8') if sys.version_info < (3,) else query,
                                    query_id=query_id
                                )
                                )
@@ -675,6 +731,13 @@ WHERE
             params: extra parameters to the function
             formatted_exception_msg: if True then function return the formatted exception message
         """
+
+        if sys.version_info < (3,):
+            if type(query) == unicode:
+                query = query.encode('utf-8')
+        else:
+            query = query.encode('utf-8')
+
         self.__async_cursor = None
         status, cur = self.__cursor()
 
@@ -687,7 +750,7 @@ WHERE
             u"Execute (async) for server #{server_id} - {conn_id} (Query-id: {query_id}):\n{query}".format(
                 server_id=self.manager.sid,
                 conn_id=self.conn_id,
-                query=query,
+                query=query.decode('utf-8'),
                 query_id=query_id
             )
         )
@@ -705,7 +768,7 @@ Failed to execute query (execute_async) for the server #{server_id} - {conn_id}
 """.format(
                 server_id=self.manager.sid,
                 conn_id=self.conn_id,
-                query=query,
+                query=query.decode('utf-8'),
                 errmsg=errmsg,
                 query_id=query_id
             )
@@ -1249,44 +1312,53 @@ Failed to reset the connection to the server due to following error:
         if not formatted_msg:
             return errmsg
 
-        errmsg += '********** Error **********\n\n'
+        errmsg += u'********** Error **********\n\n'
 
         if exception_obj.diag.severity is not None \
                 and exception_obj.diag.message_primary is not None:
-            errmsg += exception_obj.diag.severity + ": " + \
-                      exception_obj.diag.message_primary
+            errmsg += u"{}: {}".format(
+                exception_obj.diag.severity,
+                exception_obj.diag.message_primary.decode('utf-8') if
+                hasattr(str, 'decode') else exception_obj.diag.message_primary)
+
         elif exception_obj.diag.message_primary is not None:
-            errmsg += exception_obj.diag.message_primary
+            errmsg += exception_obj.diag.message_primary.decode('utf-8') if \
+                hasattr(str, 'decode') else exception_obj.diag.message_primary
 
         if exception_obj.diag.sqlstate is not None:
             if not errmsg[:-1].endswith('\n'):
                 errmsg += '\n'
             errmsg += gettext('SQL state: ')
-            errmsg += exception_obj.diag.sqlstate
+            errmsg += exception_obj.diag.sqlstate.decode('utf-8') if \
+                hasattr(str, 'decode') else exception_obj.diag.sqlstate
 
         if exception_obj.diag.message_detail is not None:
             if not errmsg[:-1].endswith('\n'):
                 errmsg += '\n'
             errmsg += gettext('Detail: ')
-            errmsg += exception_obj.diag.message_detail
+            errmsg += exception_obj.diag.message_detail.decode('utf-8') if \
+                hasattr(str, 'decode') else exception_obj.diag.message_detail
 
         if exception_obj.diag.message_hint is not None:
             if not errmsg[:-1].endswith('\n'):
                 errmsg += '\n'
             errmsg += gettext('Hint: ')
-            errmsg += exception_obj.diag.message_hint
+            errmsg += exception_obj.diag.message_hint.decode('utf-8') if \
+                hasattr(str, 'decode') else exception_obj.diag.message_hint
 
         if exception_obj.diag.statement_position is not None:
             if not errmsg[:-1].endswith('\n'):
                 errmsg += '\n'
             errmsg += gettext('Character: ')
-            errmsg += exception_obj.diag.statement_position
+            errmsg += exception_obj.diag.statement_position.decode('utf-8') if \
+                hasattr(str, 'decode') else exception_obj.diag.statement_position
 
         if exception_obj.diag.context is not None:
             if not errmsg[:-1].endswith('\n'):
                 errmsg += '\n'
             errmsg += gettext('Context: ')
-            errmsg += exception_obj.diag.context
+            errmsg += exception_obj.diag.context.decode('utf-8') if \
+                hasattr(str, 'decode') else exception_obj.diag.context
 
         return errmsg
 
-- 
Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers

Reply via email to