Dear All:
I make some improvements to pgadmin4, In order to support Greenplum6, and
fix some incompatibility issues with Greenplum5.
Source code: https://github.com/cobolbaby/pgadmin4
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 69d917d..b90bf88 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py
@@ -11,20 +11,22 @@ import re
from functools import wraps
import simplejson as json
-from flask import render_template, request, jsonify, current_app
+from flask import current_app, jsonify, render_template, request
from flask_babelex import gettext
import pgadmin.browser.server_groups.servers as servers
from config import PG_DEFAULT_DRIVER
from pgadmin.browser.collection import CollectionNodeModule, PGChildModule
-from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
- parse_priv_to_db
+from pgadmin.browser.server_groups.servers.utils import (parse_priv_from_db,
+ parse_priv_to_db)
from pgadmin.browser.utils import PGChildNodeView
-from pgadmin.utils.ajax import make_json_response, internal_server_error, \
- make_response as ajax_response, gone, bad_request
-from pgadmin.utils.driver import get_driver
-from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
from pgadmin.model import Database
+from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
+from pgadmin.utils.ajax import (bad_request, gone, internal_server_error,
+ make_json_response)
+from pgadmin.utils.ajax import make_response as ajax_response
+from pgadmin.utils.driver import get_driver
+
"""
This module is responsible for generating two nodes
@@ -266,7 +268,7 @@ class SchemaView(PGChildNodeView):
"""
Returns the template path for GreenPlum servers.
"""
- return '#gpdb#{0}#'.format(ver)
+ return 'gpdb/#gpdb#{0}#'.format(ver)
def format_request_acls(self, data, modified=False, specific=None):
acls = {}
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 a05d915..ede5040 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
@@ -16,23 +16,22 @@ import traceback
from functools import wraps
import simplejson as json
-from flask import render_template, request, jsonify, \
- current_app
+from flask import current_app, jsonify, render_template, request
from flask_babelex import gettext
import pgadmin.browser.server_groups.servers.databases as databases
from config import PG_DEFAULT_DRIVER
-from pgadmin.browser.server_groups.servers.databases.schemas.utils import \
- SchemaChildModule, DataTypeReader
-from pgadmin.browser.server_groups.servers.databases.utils import \
- parse_sec_labels_from_db, parse_variables_from_db
-from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
- parse_priv_to_db
+from pgadmin.browser.server_groups.servers.databases.schemas.utils import (
+ DataTypeReader, SchemaChildModule)
+from pgadmin.browser.server_groups.servers.databases.utils import (
+ parse_sec_labels_from_db, parse_variables_from_db)
+from pgadmin.browser.server_groups.servers.utils import (parse_priv_from_db,
+ parse_priv_to_db)
from pgadmin.browser.utils import PGChildNodeView
from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare
from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry
-from pgadmin.utils.ajax import make_json_response, internal_server_error, \
- make_response as ajax_response, gone
+from pgadmin.utils.ajax import gone, internal_server_error, make_json_response
+from pgadmin.utils.ajax import make_response as ajax_response
from pgadmin.utils.driver import get_driver
@@ -361,12 +360,11 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
template_initial = 'trigger_functions'
# Set the template path for the SQL scripts
- self.sql_template_path = "/".join([
- template_initial,
- self.manager.server_type,
- 'sql',
- '#{0}#'
- ]).format(self.manager.version)
+ self.sql_template_path = template_initial + (
+ "/{0}/sql/#{0}#{1}#".format(self.manager.server_type, self.manager.version) if
+ self.manager.server_type == 'gpdb' else
+ "/{0}/sql/#{1}#".format(self.manager.server_type, self.manager.version)
+ )
return f(*args, **kwargs)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/6_plus/get_definition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/6_plus/get_definition.sql
new file mode 100644
index 0000000..63a53d4
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/6_plus/get_definition.sql
@@ -0,0 +1,17 @@
+SELECT proretset, prosrc, probin,
+ pg_catalog.pg_get_function_arguments(pg_proc.oid) AS funcargs,
+ pg_catalog.pg_get_function_identity_arguments(pg_proc.oid) AS funciargs,
+ pg_catalog.pg_get_function_result(pg_proc.oid) AS funcresult,
+ proiswindow, provolatile, proisstrict, prosecdef,
+ proconfig, procost, prorows, prodataaccess,
+ 'a' as proexeclocation,
+ (SELECT lanname FROM pg_catalog.pg_language WHERE pg_proc.oid = prolang) as lanname,
+ COALESCE(pg_catalog.pg_get_function_identity_arguments(pg_proc.oid), '') AS func_with_identity_arguments,
+ nspname,
+ proname,
+ COALESCE(pg_catalog.pg_get_function_arguments(pg_proc.oid), '') AS func_args
+FROM pg_catalog.pg_proc
+ JOIN pg_namespace nsp ON nsp.oid=pg_proc.pronamespace
+WHERE proisagg = FALSE
+ AND pronamespace = {{scid}}::oid
+ AND pg_proc.oid = {{fnid}}::oid;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/default/get_definition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/default/get_definition.sql
index 699fc96..7cebe1b 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/default/get_definition.sql
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/templates/functions/gpdb/sql/default/get_definition.sql
@@ -2,7 +2,7 @@ SELECT proretset, prosrc, probin,
pg_catalog.pg_get_function_arguments(pg_proc.oid) AS funcargs,
pg_catalog.pg_get_function_identity_arguments(pg_proc.oid) AS funciargs,
pg_catalog.pg_get_function_result(pg_proc.oid) AS funcresult,
- proiswin, provolatile, proisstrict, prosecdef,
+ proiswin as proiswindow, provolatile, proisstrict, prosecdef,
proconfig, procost, prorows, prodataaccess,
'a' as proexeclocation,
(SELECT lanname FROM pg_catalog.pg_language WHERE pg_proc.oid = prolang) as lanname,
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 5f2aa3f..2dc7d27 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
@@ -9,21 +9,22 @@
"""Implements Foreign key constraint Node"""
-import simplejson as json
from functools import wraps
-import pgadmin.browser.server_groups.servers.databases as database
-from flask import render_template, request, jsonify
+import simplejson as json
+from flask import jsonify, render_template, request
from flask_babelex import gettext
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- constraints.type import ConstraintRegistry, ConstraintTypeModule
+
+import pgadmin.browser.server_groups.servers.databases as database
+from config import PG_DEFAULT_DRIVER
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.foreign_key import \
+ utils as fkey_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.type import (
+ ConstraintRegistry, ConstraintTypeModule)
from pgadmin.browser.utils import PGChildNodeView
-from pgadmin.utils.ajax import make_json_response, internal_server_error, \
- make_response as ajax_response, gone
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- constraints.foreign_key import utils as fkey_utils
+from pgadmin.utils.ajax import gone, internal_server_error, make_json_response
+from pgadmin.utils.ajax import make_response as ajax_response
from pgadmin.utils.driver import get_driver
-from config import PG_DEFAULT_DRIVER
FOREIGN_KEY_NOT_FOUND = gettext("Could not find the foreign key.")
@@ -184,7 +185,7 @@ class ForeignKeyConstraintView(PGChildNodeView):
"""
node_type = 'foreign_key'
- FOREIGN_KEY_PATH = 'foreign_key/sql/#{0}#'
+ FOREIGN_KEY_PATH = 'foreign_key/sql/#{0}#{1}#'
parent_ids = [
{'type': 'int', 'id': 'gid'},
@@ -233,8 +234,8 @@ class ForeignKeyConstraintView(PGChildNodeView):
self.manager.db_info[kwargs['did']]['datlastsysoid'] \
if self.manager.db_info is not None and \
kwargs['did'] in self.manager.db_info else 0
- self.template_path = self.FOREIGN_KEY_PATH.format(
- self.manager.version)
+ self.template_path = self.FOREIGN_KEY_PATH.format(self.manager.server_type,
+ self.manager.version)
# We need parent's name eg table name and schema name
schema, table = fkey_utils.get_parent(self.conn, kwargs['tid'])
@@ -338,8 +339,8 @@ class ForeignKeyConstraintView(PGChildNodeView):
"""
self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
self.conn = self.manager.connection(did=did)
- self.template_path = self.FOREIGN_KEY_PATH.format(
- self.manager.version)
+ self.template_path = self.FOREIGN_KEY_PATH.format(self.manager.server_type,
+ self.manager.version)
# We need parent's name eg table name and schema name
schema, table = fkey_utils.get_parent(self.conn, tid)
@@ -449,7 +450,8 @@ class ForeignKeyConstraintView(PGChildNodeView):
"""
self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid)
self.conn = self.manager.connection(did=did)
- self.template_path = self.FOREIGN_KEY_PATH.format(self.manager.version)
+ self.template_path = self.FOREIGN_KEY_PATH.format(self.manager.server_type,
+ self.manager.version)
# We need parent's name eg table name and schema name
schema, table = fkey_utils.get_parent(self.conn, tid)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py
index c122a4b..5b4a4d0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/foreign_key/utils.py
@@ -9,11 +9,13 @@
""" Implements Utility class for Foreign Keys. """
+from functools import wraps
+
from flask import render_template
from flask_babelex import gettext as _
+
from pgadmin.utils.ajax import internal_server_error
-from pgadmin.utils.exception import ObjectGone, ExecuteError
-from functools import wraps
+from pgadmin.utils.exception import ExecuteError, ObjectGone
FKEY_PROPERTIES_SQL = 'properties.sql'
@@ -29,8 +31,8 @@ def get_template_path(f):
# Here args[0] will hold the connection object
conn_obj = args[0]
if 'template_path' not in kwargs:
- kwargs['template_path'] = 'foreign_key/sql/#{0}#'.format(
- conn_obj.manager.version)
+ kwargs['template_path'] = 'foreign_key/sql/#{0}#{1}#'.format(conn_obj.manager.server_type,
+ conn_obj.manager.version)
return f(*args, **kwargs)
return wrap
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/gpdb_5.0_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/gpdb_5.0_plus/properties.sql
new file mode 100644
index 0000000..6837520
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/gpdb_5.0_plus/properties.sql
@@ -0,0 +1,32 @@
+SELECT
+ FALSE as convalidated,
+ ct.oid,
+ conname as name,
+ condeferrable,
+ condeferred,
+ confupdtype,
+ confdeltype,
+ CASE confmatchtype
+ WHEN 's' THEN FALSE
+ WHEN 'f' THEN TRUE
+ END AS confmatchtype,
+ conkey,
+ confkey,
+ confrelid,
+ nl.nspname as fknsp,
+ cl.relname as fktab,
+ nr.nspname as refnsp,
+ cr.relname as reftab,
+ description as comment
+FROM pg_constraint ct
+JOIN pg_class cl ON cl.oid=conrelid
+JOIN pg_namespace nl ON nl.oid=cl.relnamespace
+JOIN pg_class cr ON cr.oid=confrelid
+JOIN pg_namespace nr ON nr.oid=cr.relnamespace
+LEFT OUTER JOIN pg_description des ON (des.objoid=ct.oid AND des.classoid='pg_constraint'::regclass)
+WHERE contype='f' AND
+conrelid = {{tid}}::oid
+{% if cid %}
+AND ct.oid = {{cid}}::oid
+{% endif %}
+ORDER BY conname
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/5_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/5_plus/create.sql
new file mode 100644
index 0000000..e69de29
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/6_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/6_plus/nodes.sql
new file mode 100644
index 0000000..6b5b4ff
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/6_plus/nodes.sql
@@ -0,0 +1,39 @@
+SELECT
+ table_class.oid,
+ partitions.partitiontablename AS name,
+ (SELECT count(*)
+ FROM pg_trigger
+ WHERE tgrelid = table_class.oid AND tgisinternal = FALSE) AS triggercount,
+ (SELECT count(*)
+ FROM pg_trigger
+ WHERE tgrelid = table_class.oid AND tgisinternal = FALSE AND tgenabled = 'O') AS has_enable_triggers,
+ partitions.partitionboundary AS partition_value,
+ partitions.partitionschemaname AS schema_id,
+ schema_name,
+ CASE WHEN sub_partitions.n > 0
+ THEN TRUE
+ ELSE FALSE END is_partitioned,
+ '' AS partition_scheme
+FROM
+ (SELECT
+ table_class.relnamespace,
+ nsp.nspname AS schema_name,
+ partitions.partitiontablename,
+ partitions.partitionboundary,
+ partitions.partitionschemaname
+ FROM pg_class table_class
+ INNER JOIN pg_partitions partitions
+ ON (relname = tablename AND parentpartitiontablename IS NULL) OR relname = parentpartitiontablename
+ LEFT JOIN pg_namespace nsp ON table_class.relnamespace = nsp.oid
+ WHERE
+ {% if ptid %} table_class.oid = {{ ptid }}::OID {% endif %}
+ {% if not ptid %} table_class.oid = {{ tid }}::OID {% endif %}
+ ) AS partitions
+ LEFT JOIN (SELECT
+ parentpartitiontablename,
+ count(*) AS n
+ FROM pg_partitions
+ GROUP BY parentpartitiontablename) sub_partitions
+ ON partitions.partitiontablename = sub_partitions.parentpartitiontablename
+ LEFT JOIN pg_class table_class ON partitions.relnamespace = table_class.relnamespace AND partitions.partitiontablename = table_class.relname
+ORDER BY partitions.partitiontablename;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/6_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/6_plus/properties.sql
new file mode 100644
index 0000000..4911469
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/partitions/sql/gpdb/6_plus/properties.sql
@@ -0,0 +1,82 @@
+SELECT rel.oid, rel.relname AS name, rel.reltablespace AS spcoid,rel.relacl AS relacl_str,
+ (CASE WHEN length(spc.spcname::text) > 0 THEN spc.spcname ELSE
+ (SELECT sp.spcname FROM pg_database dtb
+ JOIN pg_tablespace sp ON dtb.dattablespace=sp.oid
+ WHERE dtb.oid = {{ did }}::oid)
+ END) as spcname,
+ (select nspname FROM pg_namespace WHERE oid = {{scid}}::oid ) as parent_schema,
+ nsp.nspname as schema,
+ pg_get_userbyid(rel.relowner) AS relowner, rel.relhasoids,
+ (CASE WHEN partitions.number_of_partitions > 0 THEN true ELSE false END) AS relispartition,
+ rel.relhassubclass, rel.reltuples::bigint, des.description, con.conname, con.conkey,
+ EXISTS(select 1 FROM pg_trigger
+ JOIN pg_proc pt ON pt.oid=tgfoid AND pt.proname='logtrigger'
+ JOIN pg_proc pc ON pc.pronamespace=pt.pronamespace AND pc.proname='slonyversion'
+ WHERE tgrelid=rel.oid) AS isrepl,
+ (SELECT count(*)
+ FROM pg_trigger
+ WHERE tgrelid = rel.oid AND tgisinternal = FALSE) AS triggercount,
+ (SELECT ARRAY(SELECT CASE WHEN (nspname NOT LIKE 'pg\_%') THEN
+ quote_ident(nspname)||'.'||quote_ident(c.relname)
+ ELSE quote_ident(c.relname) END AS inherited_tables
+ FROM pg_inherits i
+ JOIN pg_class c ON c.oid = i.inhparent
+ JOIN pg_namespace n ON n.oid=c.relnamespace
+ WHERE i.inhrelid = rel.oid ORDER BY inhseqno)) AS coll_inherits,
+ (SELECT count(*)
+ FROM pg_inherits i
+ JOIN pg_class c ON c.oid = i.inhparent
+ JOIN pg_namespace n ON n.oid=c.relnamespace
+ WHERE i.inhrelid = rel.oid) AS inherited_tables_cnt,
+ false AS relpersistence,
+ substring(array_to_string(rel.reloptions, ',') FROM 'fillfactor=([0-9]*)') AS fillfactor,
+ (substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_enabled=([a-z|0-9]*)'))::BOOL AS autovacuum_enabled,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_threshold=([0-9]*)') AS autovacuum_vacuum_threshold,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_scale_factor=([0-9]*[.]?[0-9]*)') AS autovacuum_vacuum_scale_factor,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_analyze_threshold=([0-9]*)') AS autovacuum_analyze_threshold,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_analyze_scale_factor=([0-9]*[.]?[0-9]*)') AS autovacuum_analyze_scale_factor,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_cost_delay=([0-9]*)') AS autovacuum_vacuum_cost_delay,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_cost_limit=([0-9]*)') AS autovacuum_vacuum_cost_limit,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_freeze_min_age=([0-9]*)') AS autovacuum_freeze_min_age,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_freeze_max_age=([0-9]*)') AS autovacuum_freeze_max_age,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_freeze_table_age=([0-9]*)') AS autovacuum_freeze_table_age,
+ (substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_enabled=([a-z|0-9]*)'))::BOOL AS toast_autovacuum_enabled,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_threshold=([0-9]*)') AS toast_autovacuum_vacuum_threshold,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_scale_factor=([0-9]*[.]?[0-9]*)') AS toast_autovacuum_vacuum_scale_factor,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_analyze_threshold=([0-9]*)') AS toast_autovacuum_analyze_threshold,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_analyze_scale_factor=([0-9]*[.]?[0-9]*)') AS toast_autovacuum_analyze_scale_factor,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_cost_delay=([0-9]*)') AS toast_autovacuum_vacuum_cost_delay,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_cost_limit=([0-9]*)') AS toast_autovacuum_vacuum_cost_limit,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_freeze_min_age=([0-9]*)') AS toast_autovacuum_freeze_min_age,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_freeze_max_age=([0-9]*)') AS toast_autovacuum_freeze_max_age,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_freeze_table_age=([0-9]*)') AS toast_autovacuum_freeze_table_age,
+ array_to_string(rel.reloptions, ',') AS table_vacuum_settings_str,
+ array_to_string(tst.reloptions, ',') AS toast_table_vacuum_settings_str,
+ rel.reloptions AS reloptions, tst.reloptions AS toast_reloptions, rel.reltype, typ.typname,
+ typ.typrelid AS typoid,
+ (CASE WHEN rel.reltoastrelid = 0 THEN false ELSE true END) AS hastoasttable,
+ -- Added for pgAdmin4
+ NULL AS seclabels,
+ (CASE WHEN rel.oid <= {{ datlastsysoid}}::oid THEN true ElSE false END) AS is_sys_table,
+ -- Added for partition table
+ (CASE WHEN partitions.number_of_partitions > 0 THEN true ELSE false END) AS is_partitioned,
+ '' AS partition_scheme,
+ {% if ptid %}
+ (CASE WHEN partitions.number_of_partitions > 0 THEN partitions.expression ELSE '' END) AS partition_value,
+ (SELECT relname FROM pg_class WHERE oid = {{ tid }}::oid) AS partitioned_table_name
+ {% else %}
+ partitions.expression AS partition_value
+ {% endif %}
+
+FROM pg_class rel
+ LEFT OUTER JOIN pg_tablespace spc on spc.oid=rel.reltablespace
+ LEFT OUTER JOIN pg_description des ON (des.objoid=rel.oid AND des.objsubid=0 AND des.classoid='pg_class'::regclass)
+ LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid AND con.contype='p'
+ LEFT OUTER JOIN pg_class tst ON tst.oid = rel.reltoastrelid
+ LEFT JOIN pg_type typ ON rel.reltype=typ.oid
+ LEFT JOIN pg_inherits inh ON inh.inhrelid = rel.oid
+ LEFT JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid
+ LEFT JOIN (SELECT tablename, partitionboundary as expression, count(*) number_of_partitions FROM pg_partitions GROUP BY tablename, expression) partitions ON rel.relname = tablename
+WHERE inh.inhparent = {{ tid }}::oid
+{% if ptid %} AND rel.oid = {{ ptid }}::oid {% endif %}
+ORDER BY rel.relname;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/gpdb_6.0_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/gpdb_6.0_plus/properties.sql
new file mode 100644
index 0000000..f7d0448
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/gpdb_6.0_plus/properties.sql
@@ -0,0 +1,83 @@
+SELECT *,
+ (CASE when pre_coll_inherits is NULL then ARRAY[]::varchar[] else pre_coll_inherits END) as coll_inherits
+ {% if tid %}, (CASE WHEN is_partitioned THEN (SELECT substring(pg_get_partition_def({{ tid }}::oid, true) from 14)) ELSE '' END) AS partition_scheme {% endif %}
+FROM (
+ SELECT rel.oid, rel.relname AS name, rel.reltablespace AS spcoid,rel.relacl AS relacl_str,
+ (CASE WHEN length(spc.spcname::text) > 0 THEN spc.spcname ELSE
+ (SELECT sp.spcname FROM pg_database dtb
+ JOIN pg_tablespace sp ON dtb.dattablespace=sp.oid
+ WHERE dtb.oid = {{ did }}::oid)
+ END) as spcname,
+ (select nspname FROM pg_namespace WHERE oid = {{scid}}::oid ) as schema,
+ pg_get_userbyid(rel.relowner) AS relowner, rel.relhasoids,
+ rel.relhassubclass, rel.reltuples::bigint, des.description, con.conname, con.conkey,
+ EXISTS(select 1 FROM pg_trigger
+ JOIN pg_proc pt ON pt.oid=tgfoid AND pt.proname='logtrigger'
+ JOIN pg_proc pc ON pc.pronamespace=pt.pronamespace AND pc.proname='slonyversion'
+ WHERE tgrelid=rel.oid) AS isrepl,
+ (SELECT count(*) FROM pg_trigger WHERE tgrelid=rel.oid) AS triggercount,
+ (SELECT ARRAY(SELECT CASE WHEN (nspname NOT LIKE 'pg\_%') THEN
+ quote_ident(nspname)||'.'||quote_ident(c.relname)
+ ELSE quote_ident(c.relname) END AS inherited_tables
+ FROM pg_inherits i
+ JOIN pg_class c ON c.oid = i.inhparent
+ JOIN pg_namespace n ON n.oid=c.relnamespace
+ WHERE i.inhrelid = rel.oid ORDER BY inhseqno)) AS pre_coll_inherits,
+ (SELECT count(*)
+ FROM pg_inherits i
+ JOIN pg_class c ON c.oid = i.inhparent
+ JOIN pg_namespace n ON n.oid=c.relnamespace
+ WHERE i.inhrelid = rel.oid) AS inherited_tables_cnt,
+ false AS relpersistence,
+ substring(array_to_string(rel.reloptions, ',') FROM 'fillfactor=([0-9]*)') AS fillfactor,
+ substring(array_to_string(rel.reloptions, ',') FROM 'compresslevel=([0-9]*)') AS compresslevel,
+ substring(array_to_string(rel.reloptions, ',') FROM 'blocksize=([0-9]*)') AS blocksize,
+ substring(array_to_string(rel.reloptions, ',') FROM 'orientation=(row|column)') AS orientation,
+ substring(array_to_string(rel.reloptions, ',') FROM 'appendonly=(true|false)')::boolean AS appendonly,
+ substring(array_to_string(rel.reloptions, ',') FROM 'compresstype=(zlib|quicklz|rle_type|none)') AS compresstype,
+ (CASE WHEN (substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_enabled=([a-z|0-9]*)') = 'true')
+ THEN true ELSE false END) AS autovacuum_enabled,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_threshold=([0-9]*)') AS autovacuum_vacuum_threshold,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_scale_factor=([0-9]*[.]?[0-9]*)') AS autovacuum_vacuum_scale_factor,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_analyze_threshold=([0-9]*)') AS autovacuum_analyze_threshold,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_analyze_scale_factor=([0-9]*[.]?[0-9]*)') AS autovacuum_analyze_scale_factor,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_cost_delay=([0-9]*)') AS autovacuum_vacuum_cost_delay,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_vacuum_cost_limit=([0-9]*)') AS autovacuum_vacuum_cost_limit,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_freeze_min_age=([0-9]*)') AS autovacuum_freeze_min_age,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_freeze_max_age=([0-9]*)') AS autovacuum_freeze_max_age,
+ substring(array_to_string(rel.reloptions, ',') FROM 'autovacuum_freeze_table_age=([0-9]*)') AS autovacuum_freeze_table_age,
+ (CASE WHEN (substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_enabled=([a-z|0-9]*)') = 'true')
+ THEN true ELSE false END) AS toast_autovacuum_enabled,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_threshold=([0-9]*)') AS toast_autovacuum_vacuum_threshold,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_scale_factor=([0-9]*[.]?[0-9]*)') AS toast_autovacuum_vacuum_scale_factor,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_analyze_threshold=([0-9]*)') AS toast_autovacuum_analyze_threshold,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_analyze_scale_factor=([0-9]*[.]?[0-9]*)') AS toast_autovacuum_analyze_scale_factor,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_cost_delay=([0-9]*)') AS toast_autovacuum_vacuum_cost_delay,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_vacuum_cost_limit=([0-9]*)') AS toast_autovacuum_vacuum_cost_limit,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_freeze_min_age=([0-9]*)') AS toast_autovacuum_freeze_min_age,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_freeze_max_age=([0-9]*)') AS toast_autovacuum_freeze_max_age,
+ substring(array_to_string(tst.reloptions, ',') FROM 'autovacuum_freeze_table_age=([0-9]*)') AS toast_autovacuum_freeze_table_age,
+ array_to_string(rel.reloptions, ',') AS table_vacuum_settings_str,
+ array_to_string(tst.reloptions, ',') AS toast_table_vacuum_settings_str,
+ rel.reloptions AS reloptions, tst.reloptions AS toast_reloptions, NULL AS reloftype, typ.typname AS typname,
+ typ.typrelid AS typoid,
+ (CASE WHEN rel.reltoastrelid = 0 THEN false ELSE true END) AS hastoasttable,
+ ARRAY[]::varchar[] AS seclabels,
+ (CASE WHEN rel.oid <= {{ datlastsysoid}}::oid THEN true ElSE false END) AS is_sys_table,
+
+ gdp.distkey::smallint[] AS distribution,
+ (CASE WHEN (SELECT count(*) from pg_partition where parrelid = rel.oid) > 0 THEN true ELSE false END) AS is_partitioned
+
+
+ FROM pg_class rel
+ LEFT OUTER JOIN pg_tablespace spc on spc.oid=rel.reltablespace
+ LEFT OUTER JOIN pg_description des ON (des.objoid=rel.oid AND des.objsubid=0 AND des.classoid='pg_class'::regclass)
+ LEFT OUTER JOIN pg_constraint con ON con.conrelid=rel.oid AND con.contype='p'
+ LEFT OUTER JOIN pg_class tst ON tst.oid = rel.reltoastrelid
+ LEFT OUTER JOIN gp_distribution_policy gdp ON gdp.localoid = rel.oid
+ LEFT OUTER JOIN pg_type typ ON typ.oid = rel.reltype
+
+ WHERE rel.relkind IN ('r','s','t') AND rel.relnamespace = {{ scid }}
+ {% if tid %} AND rel.oid = {{ tid }}::oid {% endif %}
+) AS TableInformation
+ ORDER BY name
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
index 1b90f8c..a95cd9f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py
@@ -9,42 +9,42 @@
""" Implements Utility class for Table and Partitioned Table. """
-import re
import copy
+import re
from functools import wraps
+
import simplejson as json
-from flask import render_template, jsonify, request
+from flask import jsonify, render_template, request
from flask_babelex import gettext
-from pgadmin.browser.server_groups.servers.databases.schemas\
- .tables.base_partition_table import BasePartitionTable
-from pgadmin.utils.ajax import make_json_response, internal_server_error, \
- gone, make_response as ajax_response
-from pgadmin.browser.server_groups.servers.databases.schemas.utils \
- import DataTypeReader, parse_rule_definition
-from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \
- parse_priv_to_db
+from config import PG_DEFAULT_DRIVER
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.base_partition_table import \
+ BasePartitionTable
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.columns import \
+ utils as column_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.compound_triggers import \
+ utils as compound_trigger_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.check_constraint import \
+ utils as check_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.exclusion_constraint import \
+ utils as exclusion_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.foreign_key import \
+ utils as fkey_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.constraints.index_constraint import \
+ utils as idxcons_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.row_security_policies import \
+ utils as row_security_policies_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.triggers import \
+ utils as trigger_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.utils import (
+ DataTypeReader, parse_rule_definition)
+from pgadmin.browser.server_groups.servers.utils import (parse_priv_from_db,
+ parse_priv_to_db)
from pgadmin.browser.utils import PGChildNodeView
+from pgadmin.utils.ajax import gone, internal_server_error, make_json_response
+from pgadmin.utils.ajax import make_response as ajax_response
from pgadmin.utils.compile_template_name import compile_template_path
from pgadmin.utils.driver import get_driver
-from config import PG_DEFAULT_DRIVER
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- columns import utils as column_utils
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- constraints.foreign_key import utils as fkey_utils
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- constraints.check_constraint import utils as check_utils
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- constraints.exclusion_constraint import utils as exclusion_utils
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- constraints.index_constraint import utils as idxcons_utils
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- triggers import utils as trigger_utils
-from pgadmin.browser.server_groups.servers.databases.schemas.tables.\
- compound_triggers import utils as compound_trigger_utils
-from pgadmin.browser.server_groups.servers.databases.schemas. \
- tables.row_security_policies import \
- utils as row_security_policies_utils
class BaseTableView(PGChildNodeView, BasePartitionTable):
@@ -682,53 +682,53 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
part_data['partition_value'] = row['partition_value']
part_data['is_partitioned'] = row['is_partitioned']
part_data['partition_scheme'] = row['partition_scheme']
- part_data['description'] = row['description']
- part_data['relowner'] = row['relowner']
+ part_data['description'] = row.get('description')
+ part_data['relowner'] = row.get('relowner')
self.update_autovacuum_properties(row)
- part_data['fillfactor'] = row['fillfactor']
- part_data['autovacuum_custom'] = row['autovacuum_custom']
- part_data['autovacuum_enabled'] = row['autovacuum_enabled']
+ part_data['fillfactor'] = row.get('fillfactor')
+ part_data['autovacuum_custom'] = row.get('autovacuum_custom')
+ part_data['autovacuum_enabled'] = row.get('autovacuum_enabled')
part_data['autovacuum_vacuum_threshold'] = \
- row['autovacuum_vacuum_threshold']
+ row.get('autovacuum_vacuum_threshold')
part_data['autovacuum_vacuum_scale_factor'] = \
- row['autovacuum_vacuum_scale_factor']
+ row.get('autovacuum_vacuum_scale_factor')
part_data['autovacuum_analyze_threshold'] = \
- row['autovacuum_analyze_threshold']
+ row.get('autovacuum_analyze_threshold')
part_data['autovacuum_analyze_scale_factor'] = \
- row['autovacuum_analyze_scale_factor']
+ row.get('autovacuum_analyze_scale_factor')
part_data['autovacuum_vacuum_cost_delay'] = \
- row['autovacuum_vacuum_cost_delay']
+ row.get('autovacuum_vacuum_cost_delay')
part_data['autovacuum_vacuum_cost_limit'] = \
- row['autovacuum_vacuum_cost_limit']
+ row.get('autovacuum_vacuum_cost_limit')
part_data['autovacuum_freeze_min_age'] = \
- row['autovacuum_freeze_min_age']
+ row.get('autovacuum_freeze_min_age')
part_data['autovacuum_freeze_max_age'] = \
- row['autovacuum_freeze_max_age']
+ row.get('autovacuum_freeze_max_age')
part_data['autovacuum_freeze_table_age'] = \
- row['autovacuum_freeze_table_age']
- part_data['toast_autovacuum'] = row['toast_autovacuum']
+ row.get('autovacuum_freeze_table_age')
+ part_data['toast_autovacuum'] = row.get('toast_autovacuum')
part_data['toast_autovacuum_enabled'] = \
- row['toast_autovacuum_enabled']
+ row.get('toast_autovacuum_enabled')
part_data['toast_autovacuum_vacuum_threshold'] = \
- row['toast_autovacuum_vacuum_threshold']
+ row.get('toast_autovacuum_vacuum_threshold')
part_data['toast_autovacuum_vacuum_scale_factor'] = \
- row['toast_autovacuum_vacuum_scale_factor']
+ row.get('toast_autovacuum_vacuum_scale_factor')
part_data['toast_autovacuum_analyze_threshold'] = \
- row['toast_autovacuum_analyze_threshold']
+ row.get('toast_autovacuum_analyze_threshold')
part_data['toast_autovacuum_analyze_scale_factor'] = \
- row['toast_autovacuum_analyze_scale_factor']
+ row.get('toast_autovacuum_analyze_scale_factor')
part_data['toast_autovacuum_vacuum_cost_delay'] = \
- row['toast_autovacuum_vacuum_cost_delay']
+ row.get('toast_autovacuum_vacuum_cost_delay')
part_data['toast_autovacuum_vacuum_cost_limit'] = \
- row['toast_autovacuum_vacuum_cost_limit']
+ row.get('toast_autovacuum_vacuum_cost_limit')
part_data['toast_autovacuum_freeze_min_age'] = \
- row['toast_autovacuum_freeze_min_age']
+ row.get('toast_autovacuum_freeze_min_age')
part_data['toast_autovacuum_freeze_max_age'] = \
- row['toast_autovacuum_freeze_max_age']
+ row.get('toast_autovacuum_freeze_max_age')
part_data['toast_autovacuum_freeze_table_age'] = \
- row['toast_autovacuum_freeze_table_age']
+ row.get('toast_autovacuum_freeze_table_age')
# We will add Auto vacuum defaults with out result for grid
part_data['vacuum_table'] = \
@@ -1817,34 +1817,33 @@ class BaseTableView(PGChildNodeView, BasePartitionTable):
# x: No set, t: true, f: false
if res is not None:
res['autovacuum_enabled'] = 'x' \
- if res['autovacuum_enabled'] is None else \
+ if res.get('autovacuum_enabled') is None else \
{True: 't', False: 'f'}[res['autovacuum_enabled']]
res['toast_autovacuum_enabled'] = 'x' \
- if res['toast_autovacuum_enabled'] is None else \
- {True: 't', False: 'f'}[
- res['toast_autovacuum_enabled']]
+ if res.get('toast_autovacuum_enabled') is None else \
+ {True: 't', False: 'f'}[res['toast_autovacuum_enabled']]
# Enable custom autovaccum only if one of the options is set
# or autovacuum is set
res['autovacuum_custom'] = any([
- res['autovacuum_vacuum_threshold'],
- res['autovacuum_vacuum_scale_factor'],
- res['autovacuum_analyze_threshold'],
- res['autovacuum_analyze_scale_factor'],
- res['autovacuum_vacuum_cost_delay'],
- res['autovacuum_vacuum_cost_limit'],
- res['autovacuum_freeze_min_age'],
- res['autovacuum_freeze_max_age'],
- res['autovacuum_freeze_table_age']]) or \
- res['autovacuum_enabled'] in ('t', 'f')
+ res.get('autovacuum_vacuum_threshold'),
+ res.get('autovacuum_vacuum_scale_factor'),
+ res.get('autovacuum_analyze_threshold'),
+ res.get('autovacuum_analyze_scale_factor'),
+ res.get('autovacuum_vacuum_cost_delay'),
+ res.get('autovacuum_vacuum_cost_limit'),
+ res.get('autovacuum_freeze_min_age'),
+ res.get('autovacuum_freeze_max_age'),
+ res.get('autovacuum_freeze_table_age')]) or \
+ res.get('autovacuum_enabled') in ('t', 'f')
res['toast_autovacuum'] = any([
- res['toast_autovacuum_vacuum_threshold'],
- res['toast_autovacuum_vacuum_scale_factor'],
- res['toast_autovacuum_analyze_threshold'],
- res['toast_autovacuum_analyze_scale_factor'],
- res['toast_autovacuum_vacuum_cost_delay'],
- res['toast_autovacuum_vacuum_cost_limit'],
- res['toast_autovacuum_freeze_min_age'],
- res['toast_autovacuum_freeze_max_age'],
- res['toast_autovacuum_freeze_table_age']]) or \
- res['toast_autovacuum_enabled'] in ('t', 'f')
+ res.get('toast_autovacuum_vacuum_threshold'),
+ res.get('toast_autovacuum_vacuum_scale_factor'),
+ res.get('toast_autovacuum_analyze_threshold'),
+ res.get('toast_autovacuum_analyze_scale_factor'),
+ res.get('toast_autovacuum_vacuum_cost_delay'),
+ res.get('toast_autovacuum_vacuum_cost_limit'),
+ res.get('toast_autovacuum_freeze_min_age'),
+ res.get('toast_autovacuum_freeze_max_age'),
+ res.get('toast_autovacuum_freeze_table_age')]) or \
+ res.get('toast_autovacuum_enabled') in ('t', 'f')
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/allowed_privs.json
new file mode 100644
index 0000000..0c1784a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/allowed_privs.json
@@ -0,0 +1,30 @@
+{# List of allowed privileges for PostgreSQL 9.2 or later #}
+{#
+ Format for allowed privileges is:
+ "acl_col": {
+ "type": "name",
+ "acl": [...]
+ }
+#}
+{
+ "nspacl": {
+ "type": "SCHEMA",
+ "acl": ["C", "U"]
+ },
+ "deftblacl": {
+ "type": "TABLE",
+ "acl": ["r", "a", "w", "d", "D", "x", "t"]
+ },
+ "defseqacl": {
+ "type": "SEQUENCE",
+ "acl": ["U", "r", "w"]
+ },
+ "deffuncacl": {
+ "type": "FUNCTION",
+ "acl": ["X"]
+ },
+ "deftypeacl": {
+ "type": "TYPE",
+ "acl": ["U"]
+ }
+}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/acl.sql
new file mode 100644
index 0000000..48dcf1f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/acl.sql
@@ -0,0 +1,7 @@
+SELECT
+ 'nspacl' AS deftype,
+ 'PUBLIC' AS grantee,
+ NULL AS grantor,
+ NULL AS privileges,
+ NULL AS grantable
+LIMIT 0;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/create.sql
new file mode 100644
index 0000000..2016209
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/create.sql
@@ -0,0 +1,40 @@
+{% import 'macros/security.macros' as SECLABEL %}
+{% import 'macros/privilege.macros' as PRIVILEGE %}
+{% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
+{% if data.name %}
+CREATE SCHEMA {{ conn|qtIdent(data.name) }}{% if data.namespaceowner %}
+
+ AUTHORIZATION {{ conn|qtIdent(data.namespaceowner) }}{% endif %}{% endif %};
+{# Alter the comment/description #}
+{% if data.description %}
+
+COMMENT ON SCHEMA {{ conn|qtIdent(data.name) }}
+ IS {{ data.description|qtLiteral }};
+{% endif %}
+{# ACL for the schema #}
+{% if data.nspacl %}
+{% for priv in data.nspacl %}
+
+{{ PRIVILEGE.APPLY(conn, 'SCHEMA', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}{% endfor %}
+{% endif %}
+{# Default privileges on tables #}
+{% for defacl, type in [
+ ('deftblacl', 'TABLES'), ('defseqacl', 'SEQUENCES'),
+ ('deffuncacl', 'FUNCTIONS'), ('deftypeacl', 'TYPES')]
+%}
+{% if data[defacl] %}{% set acl = data[defacl] %}
+{% for priv in acl %}
+
+{{ DEFAULT_PRIVILEGE.SET(
+ conn, 'SCHEMA', data.name, type, priv.grantee,
+ priv.without_grant, priv.with_grant
+ ) }}{% endfor %}
+{% endif %}
+{% endfor %}
+{# Security Labels on schema #}
+{% if data.seclabels and data.seclabels|length > 0 %}
+{% for r in data.seclabels %}
+
+{{ SECLABEL.APPLY(conn, 'SCHEMA', data.name, r.provider, r.label) }}
+{% endfor %}
+{% endif %}
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/defacl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/defacl.sql
new file mode 100644
index 0000000..191e40c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/defacl.sql
@@ -0,0 +1,7 @@
+SELECT
+ '' AS deftype,
+ '' AS grantee,
+ '' AS grantor,
+ '' AS grantor,
+ '' AS privileges,
+ '' AS grantable
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/delete.sql
new file mode 100644
index 0000000..74e9126
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/delete.sql
@@ -0,0 +1 @@
+DROP SCHEMA {{ conn|qtIdent(name) }} {% if cascade %}CASCADE{%endif%};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/get_name.sql
new file mode 100644
index 0000000..3c5187d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/get_name.sql
@@ -0,0 +1 @@
+SELECT nsp.nspname FROM pg_namespace nsp WHERE nsp.oid = {{ scid|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/is_catalog.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/is_catalog.sql
new file mode 100644
index 0000000..9386acb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/is_catalog.sql
@@ -0,0 +1,9 @@
+{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %}
+SELECT
+ nsp.nspname as schema_name,
+ {{ CATALOGS.LIST('nsp') }} AS is_catalog,
+ {{ CATALOGS.DB_SUPPORT('nsp') }} AS db_support
+FROM
+ pg_catalog.pg_namespace nsp
+WHERE
+ nsp.oid = {{ scid|qtLiteral }}::OID;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/nodes.sql
new file mode 100644
index 0000000..d1a19d1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/nodes.sql
@@ -0,0 +1,20 @@
+{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %}
+SELECT
+ nsp.oid,
+ nsp.nspname as name,
+ has_schema_privilege(nsp.oid, 'CREATE') as can_create,
+ has_schema_privilege(nsp.oid, 'USAGE') as has_usage
+FROM
+ pg_namespace nsp
+WHERE
+ {% if scid %}
+ nsp.oid={{scid}}::oid AND
+ {% else %}
+ {% if not show_sysobj %}
+ nspname NOT LIKE 'pg\_%' AND
+ {% endif %}
+ {% endif %}
+ NOT (
+{{ CATALOGS.LIST('nsp') }}
+ )
+ORDER BY nspname;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/oid.sql
new file mode 100644
index 0000000..c5329b3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/oid.sql
@@ -0,0 +1 @@
+SELECT nsp.oid FROM pg_namespace nsp WHERE nsp.nspname = {{ schema|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/properties.sql
new file mode 100644
index 0000000..f6c2d92
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/properties.sql
@@ -0,0 +1,39 @@
+{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %}
+SELECT
+ CASE
+ WHEN (nspname LIKE E'pg\\_temp\\_%') THEN 1
+ WHEN (nspname LIKE E'pg\\_%') THEN 0
+ ELSE 3 END AS nsptyp,
+ nsp.nspname AS name,
+ nsp.oid,
+ array_to_string(nsp.nspacl::text[], ', ') as acl,
+ r.rolname AS namespaceowner, description,
+ has_schema_privilege(nsp.oid, 'CREATE') AS can_create,
+ CASE
+ WHEN nspname LIKE E'pg\\_%' THEN true
+ ELSE false END AS is_sys_object,
+ {### Default ACL for Tables ###}
+ '' AS tblacl,
+ {### Default ACL for Sequnces ###}
+ '' AS seqacl,
+ {### Default ACL for Functions ###}
+ '' AS funcacl,
+ {### Default ACL for Type ###}
+ '' AS typeacl
+FROM
+ pg_namespace nsp
+ LEFT OUTER JOIN pg_description des ON
+ (des.objoid=nsp.oid AND des.classoid='pg_namespace'::regclass)
+ LEFT JOIN pg_roles r ON (r.oid = nsp.nspowner)
+WHERE
+ {% if scid %}
+ nsp.oid={{scid}}::oid AND
+ {% else %}
+ {% if not show_sysobj %}
+ nspname NOT LIKE E'pg\\_%' AND
+ {% endif %}
+ {% endif %}
+ NOT (
+{{ CATALOGS.LIST('nsp') }}
+ )
+ORDER BY 1, nspname;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/update.sql
new file mode 100644
index 0000000..47f6e13
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb/5_plus/sql/update.sql
@@ -0,0 +1,83 @@
+{% import 'macros/security.macros' as SECLABEL %}
+{% import 'macros/privilege.macros' as PRIVILEGE %}
+{% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
+{# Rename the schema #}
+{% if data.name and data.name != o_data.name %}
+ALTER SCHEMA {{ conn|qtIdent(o_data.name) }}
+ RENAME TO {{ conn|qtIdent(data.name) }};
+
+{% endif %}
+{# Change the owner #}
+{% if data.namespaceowner and data.namespaceowner != o_data.namespaceowner %}
+ALTER SCHEMA {{ conn|qtIdent(data.name) }}
+ OWNER TO {{ conn|qtIdent(data.namespaceowner) }};
+
+{% endif %}
+{# Update the comments/description #}
+{% if data.description is defined and data.description != o_data.description %}
+COMMENT ON SCHEMA {{ conn|qtIdent(data.name) }}
+ IS {{ data.description|qtLiteral }};
+
+{% endif %}
+{# Change the privileges #}
+{% if data.nspacl %}
+{% if 'deleted' in data.nspacl %}
+{% for priv in data.nspacl.deleted %}
+{{ PRIVILEGE.RESETALL(conn, 'SCHEMA', priv.grantee, data.name) }}
+{% endfor %}
+{% endif %}
+{% if 'changed' in data.nspacl %}
+{% for priv in data.nspacl.changed %}
+{{ PRIVILEGE.RESETALL(conn, 'SCHEMA', priv.grantee, data.name) }}
+{{ PRIVILEGE.APPLY(conn, 'SCHEMA', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}
+{% endfor %}
+{% endif %}
+{% if 'added' in data.nspacl %}
+{% for priv in data.nspacl.added %}
+{{ PRIVILEGE.APPLY(conn, 'SCHEMA', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}
+{% endfor %}
+{% endif %}
+{% endif %}
+{# Change the default privileges #}
+{% for defacl, type in [
+ ('deftblacl', 'TABLES'), ('defseqacl', 'SEQUENCES'),
+ ('deffuncacl', 'FUNCTIONS'), ('deftypeacl', 'TYPES')]
+%}
+{% if data[defacl] %}{% set acl = data[defacl] %}
+{% if 'deleted' in acl %}
+{% for priv in acl.deleted %}
+{{ DEFAULT_PRIVILEGE.UNSET(conn, 'SCHEMA', data.name, type, priv.grantee) }}
+{% endfor %}
+{% endif %}
+{% if 'changed' in acl %}
+{% for priv in acl.changed %}
+{{ DEFAULT_PRIVILEGE.UNSET(conn, 'SCHEMA', data.name, type, priv.grantee) }}
+{{ DEFAULT_PRIVILEGE.SET(conn,'SCHEMA', data.name, type, priv.grantee, priv.without_grant, priv.with_grant) }}
+{% endfor %}
+{% endif %}
+{% if 'added' in acl %}
+{% for priv in acl.added %}
+{{ DEFAULT_PRIVILEGE.SET(conn,'SCHEMA', data.name, type, priv.grantee, priv.without_grant, priv.with_grant) }}
+{% endfor %}
+{% endif %}
+{% endif %}
+{% endfor %}
+{# Change the security labels #}
+{% if data.seclabels and data.seclabels|length > 0 %}
+{% set seclabels = data.seclabels %}
+{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %}
+{% for r in seclabels.deleted %}
+{{ SECLABEL.DROP(conn, 'SCHEMA', data.name, r.provider) }}
+{% endfor %}
+{% endif %}
+{% if 'added' in seclabels and seclabels.added|length > 0 %}
+{% for r in seclabels.added %}
+{{ SECLABEL.APPLY(conn, 'SCHEMA', data.name, r.provider, r.label) }}
+{% endfor %}
+{% endif %}
+{% if 'changed' in seclabels and seclabels.changed|length > 0 %}
+{% for r in seclabels.changed %}
+{{ SECLABEL.APPLY(conn, 'SCHEMA', data.name, r.provider, r.label) }}
+{% endfor %}
+{% endif %}
+{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/allowed_privs.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/allowed_privs.json
deleted file mode 100644
index 0c1784a..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/allowed_privs.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{# List of allowed privileges for PostgreSQL 9.2 or later #}
-{#
- Format for allowed privileges is:
- "acl_col": {
- "type": "name",
- "acl": [...]
- }
-#}
-{
- "nspacl": {
- "type": "SCHEMA",
- "acl": ["C", "U"]
- },
- "deftblacl": {
- "type": "TABLE",
- "acl": ["r", "a", "w", "d", "D", "x", "t"]
- },
- "defseqacl": {
- "type": "SEQUENCE",
- "acl": ["U", "r", "w"]
- },
- "deffuncacl": {
- "type": "FUNCTION",
- "acl": ["X"]
- },
- "deftypeacl": {
- "type": "TYPE",
- "acl": ["U"]
- }
-}
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/acl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/acl.sql
deleted file mode 100644
index 48dcf1f..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/acl.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-SELECT
- 'nspacl' AS deftype,
- 'PUBLIC' AS grantee,
- NULL AS grantor,
- NULL AS privileges,
- NULL AS grantable
-LIMIT 0;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/create.sql
deleted file mode 100644
index 2016209..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/create.sql
+++ /dev/null
@@ -1,40 +0,0 @@
-{% import 'macros/security.macros' as SECLABEL %}
-{% import 'macros/privilege.macros' as PRIVILEGE %}
-{% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
-{% if data.name %}
-CREATE SCHEMA {{ conn|qtIdent(data.name) }}{% if data.namespaceowner %}
-
- AUTHORIZATION {{ conn|qtIdent(data.namespaceowner) }}{% endif %}{% endif %};
-{# Alter the comment/description #}
-{% if data.description %}
-
-COMMENT ON SCHEMA {{ conn|qtIdent(data.name) }}
- IS {{ data.description|qtLiteral }};
-{% endif %}
-{# ACL for the schema #}
-{% if data.nspacl %}
-{% for priv in data.nspacl %}
-
-{{ PRIVILEGE.APPLY(conn, 'SCHEMA', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}{% endfor %}
-{% endif %}
-{# Default privileges on tables #}
-{% for defacl, type in [
- ('deftblacl', 'TABLES'), ('defseqacl', 'SEQUENCES'),
- ('deffuncacl', 'FUNCTIONS'), ('deftypeacl', 'TYPES')]
-%}
-{% if data[defacl] %}{% set acl = data[defacl] %}
-{% for priv in acl %}
-
-{{ DEFAULT_PRIVILEGE.SET(
- conn, 'SCHEMA', data.name, type, priv.grantee,
- priv.without_grant, priv.with_grant
- ) }}{% endfor %}
-{% endif %}
-{% endfor %}
-{# Security Labels on schema #}
-{% if data.seclabels and data.seclabels|length > 0 %}
-{% for r in data.seclabels %}
-
-{{ SECLABEL.APPLY(conn, 'SCHEMA', data.name, r.provider, r.label) }}
-{% endfor %}
-{% endif %}
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/defacl.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/defacl.sql
deleted file mode 100644
index 191e40c..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/defacl.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-SELECT
- '' AS deftype,
- '' AS grantee,
- '' AS grantor,
- '' AS grantor,
- '' AS privileges,
- '' AS grantable
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/delete.sql
deleted file mode 100644
index 74e9126..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/delete.sql
+++ /dev/null
@@ -1 +0,0 @@
-DROP SCHEMA {{ conn|qtIdent(name) }} {% if cascade %}CASCADE{%endif%};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/get_name.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/get_name.sql
deleted file mode 100644
index 3c5187d..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/get_name.sql
+++ /dev/null
@@ -1 +0,0 @@
-SELECT nsp.nspname FROM pg_namespace nsp WHERE nsp.oid = {{ scid|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/is_catalog.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/is_catalog.sql
deleted file mode 100644
index 9386acb..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/is_catalog.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %}
-SELECT
- nsp.nspname as schema_name,
- {{ CATALOGS.LIST('nsp') }} AS is_catalog,
- {{ CATALOGS.DB_SUPPORT('nsp') }} AS db_support
-FROM
- pg_catalog.pg_namespace nsp
-WHERE
- nsp.oid = {{ scid|qtLiteral }}::OID;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/nodes.sql
deleted file mode 100644
index d1a19d1..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/nodes.sql
+++ /dev/null
@@ -1,20 +0,0 @@
-{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %}
-SELECT
- nsp.oid,
- nsp.nspname as name,
- has_schema_privilege(nsp.oid, 'CREATE') as can_create,
- has_schema_privilege(nsp.oid, 'USAGE') as has_usage
-FROM
- pg_namespace nsp
-WHERE
- {% if scid %}
- nsp.oid={{scid}}::oid AND
- {% else %}
- {% if not show_sysobj %}
- nspname NOT LIKE 'pg\_%' AND
- {% endif %}
- {% endif %}
- NOT (
-{{ CATALOGS.LIST('nsp') }}
- )
-ORDER BY nspname;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/oid.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/oid.sql
deleted file mode 100644
index c5329b3..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/oid.sql
+++ /dev/null
@@ -1 +0,0 @@
-SELECT nsp.oid FROM pg_namespace nsp WHERE nsp.nspname = {{ schema|qtLiteral }};
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/properties.sql
deleted file mode 100644
index f6c2d92..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/properties.sql
+++ /dev/null
@@ -1,39 +0,0 @@
-{% import 'catalog/pg/macros/catalogs.sql' as CATALOGS %}
-SELECT
- CASE
- WHEN (nspname LIKE E'pg\\_temp\\_%') THEN 1
- WHEN (nspname LIKE E'pg\\_%') THEN 0
- ELSE 3 END AS nsptyp,
- nsp.nspname AS name,
- nsp.oid,
- array_to_string(nsp.nspacl::text[], ', ') as acl,
- r.rolname AS namespaceowner, description,
- has_schema_privilege(nsp.oid, 'CREATE') AS can_create,
- CASE
- WHEN nspname LIKE E'pg\\_%' THEN true
- ELSE false END AS is_sys_object,
- {### Default ACL for Tables ###}
- '' AS tblacl,
- {### Default ACL for Sequnces ###}
- '' AS seqacl,
- {### Default ACL for Functions ###}
- '' AS funcacl,
- {### Default ACL for Type ###}
- '' AS typeacl
-FROM
- pg_namespace nsp
- LEFT OUTER JOIN pg_description des ON
- (des.objoid=nsp.oid AND des.classoid='pg_namespace'::regclass)
- LEFT JOIN pg_roles r ON (r.oid = nsp.nspowner)
-WHERE
- {% if scid %}
- nsp.oid={{scid}}::oid AND
- {% else %}
- {% if not show_sysobj %}
- nspname NOT LIKE E'pg\\_%' AND
- {% endif %}
- {% endif %}
- NOT (
-{{ CATALOGS.LIST('nsp') }}
- )
-ORDER BY 1, nspname;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/update.sql
deleted file mode 100644
index 47f6e13..0000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/schemas/gpdb_5.0_plus/sql/update.sql
+++ /dev/null
@@ -1,83 +0,0 @@
-{% import 'macros/security.macros' as SECLABEL %}
-{% import 'macros/privilege.macros' as PRIVILEGE %}
-{% import 'macros/default_privilege.macros' as DEFAULT_PRIVILEGE %}
-{# Rename the schema #}
-{% if data.name and data.name != o_data.name %}
-ALTER SCHEMA {{ conn|qtIdent(o_data.name) }}
- RENAME TO {{ conn|qtIdent(data.name) }};
-
-{% endif %}
-{# Change the owner #}
-{% if data.namespaceowner and data.namespaceowner != o_data.namespaceowner %}
-ALTER SCHEMA {{ conn|qtIdent(data.name) }}
- OWNER TO {{ conn|qtIdent(data.namespaceowner) }};
-
-{% endif %}
-{# Update the comments/description #}
-{% if data.description is defined and data.description != o_data.description %}
-COMMENT ON SCHEMA {{ conn|qtIdent(data.name) }}
- IS {{ data.description|qtLiteral }};
-
-{% endif %}
-{# Change the privileges #}
-{% if data.nspacl %}
-{% if 'deleted' in data.nspacl %}
-{% for priv in data.nspacl.deleted %}
-{{ PRIVILEGE.RESETALL(conn, 'SCHEMA', priv.grantee, data.name) }}
-{% endfor %}
-{% endif %}
-{% if 'changed' in data.nspacl %}
-{% for priv in data.nspacl.changed %}
-{{ PRIVILEGE.RESETALL(conn, 'SCHEMA', priv.grantee, data.name) }}
-{{ PRIVILEGE.APPLY(conn, 'SCHEMA', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}
-{% endfor %}
-{% endif %}
-{% if 'added' in data.nspacl %}
-{% for priv in data.nspacl.added %}
-{{ PRIVILEGE.APPLY(conn, 'SCHEMA', priv.grantee, data.name, priv.without_grant, priv.with_grant) }}
-{% endfor %}
-{% endif %}
-{% endif %}
-{# Change the default privileges #}
-{% for defacl, type in [
- ('deftblacl', 'TABLES'), ('defseqacl', 'SEQUENCES'),
- ('deffuncacl', 'FUNCTIONS'), ('deftypeacl', 'TYPES')]
-%}
-{% if data[defacl] %}{% set acl = data[defacl] %}
-{% if 'deleted' in acl %}
-{% for priv in acl.deleted %}
-{{ DEFAULT_PRIVILEGE.UNSET(conn, 'SCHEMA', data.name, type, priv.grantee) }}
-{% endfor %}
-{% endif %}
-{% if 'changed' in acl %}
-{% for priv in acl.changed %}
-{{ DEFAULT_PRIVILEGE.UNSET(conn, 'SCHEMA', data.name, type, priv.grantee) }}
-{{ DEFAULT_PRIVILEGE.SET(conn,'SCHEMA', data.name, type, priv.grantee, priv.without_grant, priv.with_grant) }}
-{% endfor %}
-{% endif %}
-{% if 'added' in acl %}
-{% for priv in acl.added %}
-{{ DEFAULT_PRIVILEGE.SET(conn,'SCHEMA', data.name, type, priv.grantee, priv.without_grant, priv.with_grant) }}
-{% endfor %}
-{% endif %}
-{% endif %}
-{% endfor %}
-{# Change the security labels #}
-{% if data.seclabels and data.seclabels|length > 0 %}
-{% set seclabels = data.seclabels %}
-{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %}
-{% for r in seclabels.deleted %}
-{{ SECLABEL.DROP(conn, 'SCHEMA', data.name, r.provider) }}
-{% endfor %}
-{% endif %}
-{% if 'added' in seclabels and seclabels.added|length > 0 %}
-{% for r in seclabels.added %}
-{{ SECLABEL.APPLY(conn, 'SCHEMA', data.name, r.provider, r.label) }}
-{% endfor %}
-{% endif %}
-{% if 'changed' in seclabels and seclabels.changed|length > 0 %}
-{% for r in seclabels.changed %}
-{{ SECLABEL.APPLY(conn, 'SCHEMA', data.name, r.provider, r.label) }}
-{% endfor %}
-{% endif %}
-{% endif %}
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependencies.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependencies.sql
index 81bb2a6..8a816ca 100644
--- a/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependencies.sql
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependencies.sql
@@ -1,32 +1,23 @@
-SELECT DISTINCT dep.deptype, dep.refclassid, dep.refobjid, cl.relkind, ad.adbin, ad.adsrc,
- CASE WHEN cl.relkind IS NOT NULL THEN CASE WHEN cl.relkind = 'r' THEN cl.relkind || COALESCE(dep.refobjsubid::text, '') ELSE cl.relkind END
- WHEN tg.oid IS NOT NULL THEN 'Tr'::text
- WHEN ty.oid IS NOT NULL THEN CASE WHEN ty.typtype = 'd' THEN 'd'::text ELSE 'Ty'::text END
+SET LOCAL join_collapse_limit=8;
+SELECT DISTINCT dep.deptype, dep.refclassid, cl.relkind, ad.adbin, ad.adsrc,
+ CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.refobjsubid::character varying, '')
+ WHEN tg.oid IS NOT NULL THEN 'T'::text
+ WHEN ty.oid IS NOT NULL AND ty.typbasetype = 0 THEN 'y'::text
+ WHEN ty.oid IS NOT NULL AND ty.typbasetype != 0 THEN 'd'::text
WHEN ns.oid IS NOT NULL THEN 'n'::text
- WHEN pr.oid IS NOT NULL AND (prtyp.typname = 'trigger' OR prtyp.typname = 'event_trigger') THEN 'Pt'::text
- WHEN pr.oid IS NOT NULL THEN 'Pf'::text
+ WHEN pr.oid IS NOT NULL AND prtyp.typname = 'trigger' THEN 't'::text
+ WHEN pr.oid IS NOT NULL THEN 'P'::text
WHEN la.oid IS NOT NULL THEN 'l'::text
- WHEN rw.oid IS NOT NULL THEN 'Rl'::text
- WHEN co.oid IS NOT NULL THEN CASE WHEN co.contypid > 0 THEN 'Cd' ELSE 'C'::text || contype END
+ WHEN rw.oid IS NOT NULL THEN 'R'::text
+ WHEN co.oid IS NOT NULL THEN 'C'::text || contype
WHEN ad.oid IS NOT NULL THEN 'A'::text
- WHEN fs.oid IS NOT NULL THEN 'Fs'::text
- WHEN fdw.oid IS NOT NULL THEN 'Fw'::text
- WHEN col.oid IS NOT NULL THEN 'Co'::text
- WHEN ftsc.oid IS NOT NULL THEN 'Fc'::text
- WHEN ftsp.oid IS NOT NULL THEN 'Fp'::text
- WHEN ftsd.oid IS NOT NULL THEN 'Fd'::text
- WHEN ftst.oid IS NOT NULL THEN 'Ft'::text
- WHEN ext.oid IS NOT NULL THEN 'Ex'::text
ELSE ''
END AS type,
COALESCE(coc.relname, clrw.relname) AS ownertable,
CASE WHEN cl.relname IS NOT NULL OR att.attname IS NOT NULL THEN cl.relname || COALESCE('.' || att.attname, '')
- ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname,
- fs.srvname, fdw.fdwname, col.collname, ftsc.cfgname, ftsd.dictname, ftsp.prsname,
- ftst.tmplname, ext.extname)
+ ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname)
END AS refname,
- COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname, colns.nspname, ftscns.nspname,
- ftsdns.nspname, ftspns.nspname, ftstns.nspname) AS nspname,
+ COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname,
CASE WHEN inhits.inhparent IS NOT NULL THEN '1' ELSE '0' END AS is_inherits,
CASE WHEN inhed.inhparent IS NOT NULL THEN '1' ELSE '0' END AS is_inherited
FROM pg_depend dep
@@ -47,39 +38,11 @@ LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
LEFT JOIN pg_language la ON dep.refobjid=la.oid
LEFT JOIN pg_namespace ns ON dep.refobjid=ns.oid
LEFT JOIN pg_attrdef ad ON ad.adrelid=att.attrelid AND ad.adnum=att.attnum
-LEFT JOIN pg_foreign_server fs ON fs.oid=dep.refobjid
-LEFT JOIN pg_foreign_data_wrapper fdw ON fdw.oid=dep.refobjid
LEFT JOIN pg_type prtyp ON prtyp.oid = pr.prorettype
LEFT JOIN pg_inherits inhits ON (inhits.inhrelid=dep.refobjid)
LEFT JOIN pg_inherits inhed ON (inhed.inhparent=dep.refobjid)
-LEFT JOIN pg_collation col ON col.oid=dep.refobjid
-LEFT JOIN pg_namespace colns ON col.collnamespace=colns.oid
-LEFT JOIN pg_ts_config ftsc ON ftsc.oid=dep.refobjid
-LEFT JOIN pg_namespace ftscns ON ftsc.cfgnamespace=ftscns.oid
-LEFT JOIN pg_ts_dict ftsd ON ftsd.oid=dep.refobjid
-LEFT JOIN pg_namespace ftsdns ON ftsd.dictnamespace=ftsdns.oid
-LEFT JOIN pg_ts_parser ftsp ON ftsp.oid=dep.refobjid
-LEFT JOIN pg_namespace ftspns ON ftsp.prsnamespace=ftspns.oid
-LEFT JOIN pg_ts_template ftst ON ftst.oid=dep.refobjid
-LEFT JOIN pg_namespace ftstns ON ftst.tmplnamespace=ftstns.oid
-LEFT JOIN pg_extension ext ON ext.oid=dep.refobjid
{{where_clause}} AND
refclassid IN ( SELECT oid FROM pg_class WHERE relname IN
('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
- 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_foreign_server', 'pg_foreign_data_wrapper',
- 'pg_collation', 'pg_ts_config', 'pg_ts_dict', 'pg_ts_parser', 'pg_ts_template', 'pg_extension'))
-UNION
-SELECT DISTINCT dep.deptype, dep.refclassid, dep.refobjid, cl.relkind, ad.adbin, ad.adsrc,
- CASE WHEN cl.relkind IS NOT NULL THEN CASE WHEN cl.relkind = 'r' THEN cl.relkind || COALESCE(dep.refobjsubid::text, '') ELSE cl.relkind END
- ELSE '' END AS type,
- NULL AS ownertable,
- CASE WHEN cl.relname IS NOT NULL OR att.attname IS NOT NULL THEN cl.relname || COALESCE('.' || att.attname, '')
- ELSE cl.relname END AS refname,
- nsc.nspname AS nspname, '0' AS is_inherits, '0' AS is_inherited
-FROM pg_depend dep
-LEFT JOIN pg_class cl ON dep.refobjid=cl.oid
-LEFT JOIN pg_attribute att ON dep.refobjid=att.attrelid AND dep.refobjsubid=att.attnum
-LEFT JOIN pg_namespace nsc ON cl.relnamespace=nsc.oid
-LEFT JOIN pg_attrdef ad ON ad.adrelid=att.attrelid AND ad.adnum=att.attnum
-WHERE dep.objid IN (SELECT oid FROM pg_rewrite WHERE ev_class={{object_id}}) AND cl.relkind not in ('v', 'm')
-ORDER BY refclassid, relkind
+ 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
+ORDER BY refclassid, cl.relkind
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependents.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependents.sql
index 71b0a1e..f8a1bee 100644
--- a/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependents.sql
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/gpdb/5_plus/dependents.sql
@@ -1,32 +1,22 @@
+SET LOCAL join_collapse_limit=8;
SELECT DISTINCT dep.deptype, dep.classid, cl.relkind, ad.adbin, ad.adsrc,
- CASE WHEN cl.relkind IS NOT NULL THEN CASE WHEN cl.relkind = 'r' THEN cl.relkind || COALESCE(dep.objsubid::text, '') ELSE cl.relkind END
- WHEN tg.oid IS NOT NULL THEN 'Tr'::text
- WHEN ty.oid IS NOT NULL THEN CASE WHEN ty.typtype = 'd' THEN 'd'::text ELSE 'Ty'::text END
+ CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.objsubid::text, '')
+ WHEN tg.oid IS NOT NULL THEN 'T'::text
+ WHEN ty.oid IS NOT NULL THEN 'y'::text
WHEN ns.oid IS NOT NULL THEN 'n'::text
- WHEN pr.oid IS NOT NULL AND (prtyp.typname = 'trigger' OR prtyp.typname = 'event_trigger') THEN 'Pt'::text
- WHEN pr.oid IS NOT NULL THEN 'Pf'::text
+ WHEN pr.oid IS NOT NULL AND prtyp.typname = 'trigger' THEN 't'::text
+ WHEN pr.oid IS NOT NULL THEN 'P'::text
WHEN la.oid IS NOT NULL THEN 'l'::text
- WHEN rw.oid IS NOT NULL THEN 'Rl'::text
- WHEN co.oid IS NOT NULL THEN CASE WHEN co.contypid > 0 THEN 'Cd' ELSE 'C'::text || contype END
+ WHEN rw.oid IS NOT NULL THEN 'R'::text
+ WHEN co.oid IS NOT NULL THEN 'C'::text || contype
WHEN ad.oid IS NOT NULL THEN 'A'::text
- WHEN fs.oid IS NOT NULL THEN 'Fs'::text
- WHEN fdw.oid IS NOT NULL THEN 'Fw'::text
- WHEN col.oid IS NOT NULL THEN 'Co'::text
- WHEN ftsc.oid IS NOT NULL THEN 'Fc'::text
- WHEN ftsp.oid IS NOT NULL THEN 'Fp'::text
- WHEN ftsd.oid IS NOT NULL THEN 'Fd'::text
- WHEN ftst.oid IS NOT NULL THEN 'Ft'::text
- WHEN ext.oid IS NOT NULL THEN 'Ex'::text
- ELSE ''
+ ELSE ''
END AS type,
COALESCE(coc.relname, clrw.relname) AS ownertable,
CASE WHEN cl.relname IS NOT NULL AND att.attname IS NOT NULL THEN cl.relname || COALESCE('.' || att.attname, '')
- ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname,
- fs.srvname, fdw.fdwname, col.collname, ftsc.cfgname, ftsd.dictname, ftsp.prsname,
- ftst.tmplname, ext.extname)
+ ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname)
END AS refname,
- COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname, colns.nspname, ftscns.nspname,
- ftsdns.nspname, ftspns.nspname, ftstns.nspname) AS nspname,
+ COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname,
CASE WHEN inhits.inhparent IS NOT NULL THEN '1' ELSE '0' END AS is_inherits,
CASE WHEN inhed.inhparent IS NOT NULL THEN '1' ELSE '0' END AS is_inherited
FROM pg_depend dep
@@ -47,25 +37,11 @@ LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
LEFT JOIN pg_language la ON dep.objid=la.oid
LEFT JOIN pg_namespace ns ON dep.objid=ns.oid
LEFT JOIN pg_attrdef ad ON ad.oid=dep.objid
-LEFT JOIN pg_foreign_server fs ON fs.oid=dep.objid
-LEFT JOIN pg_foreign_data_wrapper fdw ON fdw.oid=dep.objid
LEFT JOIN pg_type prtyp ON prtyp.oid = pr.prorettype
LEFT JOIN pg_inherits inhits ON (inhits.inhrelid=dep.objid)
LEFT JOIN pg_inherits inhed ON (inhed.inhparent=dep.objid)
-LEFT JOIN pg_collation col ON col.oid=dep.objid
-LEFT JOIN pg_namespace colns ON col.collnamespace=colns.oid
-LEFT JOIN pg_ts_config ftsc ON ftsc.oid=dep.objid
-LEFT JOIN pg_namespace ftscns ON ftsc.cfgnamespace=ftscns.oid
-LEFT JOIN pg_ts_dict ftsd ON ftsd.oid=dep.objid
-LEFT JOIN pg_namespace ftsdns ON ftsd.dictnamespace=ftsdns.oid
-LEFT JOIN pg_ts_parser ftsp ON ftsp.oid=dep.objid
-LEFT JOIN pg_namespace ftspns ON ftsp.prsnamespace=ftspns.oid
-LEFT JOIN pg_ts_template ftst ON ftst.oid=dep.objid
-LEFT JOIN pg_namespace ftstns ON ftst.tmplnamespace=ftstns.oid
-LEFT JOIN pg_extension ext ON ext.oid=dep.objid
{{where_clause}} AND
classid IN ( SELECT oid FROM pg_class WHERE relname IN
('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
- 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_foreign_server', 'pg_foreign_data_wrapper',
- 'pg_collation', 'pg_ts_config', 'pg_ts_dict', 'pg_ts_parser', 'pg_ts_template', 'pg_extension'))
-ORDER BY classid, cl.relkind
+ 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
+ORDER BY classid, cl.relkind;
diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py
index 91a7119..a570743 100644
--- a/web/pgadmin/browser/utils.py
+++ b/web/pgadmin/browser/utils.py
@@ -12,15 +12,15 @@
from abc import abstractmethod
import flask
-from flask import render_template, current_app
-from flask.views import View, MethodViewType, with_metaclass
+from flask import current_app, render_template
+from flask.views import MethodViewType, View, with_metaclass
from flask_babelex import gettext
from config import PG_DEFAULT_DRIVER
-from pgadmin.utils.ajax import make_json_response, precondition_required,\
- internal_server_error
-from pgadmin.utils.exception import ConnectionLost, SSHTunnelConnectionLost,\
- CryptKeyMissing
+from pgadmin.utils.ajax import (internal_server_error, make_json_response,
+ precondition_required)
+from pgadmin.utils.exception import (ConnectionLost, CryptKeyMissing,
+ SSHTunnelConnectionLost)
def underscore_escape(text):
@@ -471,9 +471,12 @@ class PGChildNodeView(NodeView):
"""
# Set the sql_path
- sql_path = 'depends/{0}/#{1}#'.format(
- conn.manager.server_type, conn.manager.version)
-
+ sql_path = 'depends/' + (
+ "{0}/#{0}#{1}#".format(conn.manager.server_type, conn.manager.version) if
+ conn.manager.server_type == 'gpdb' else
+ "{0}/#{1}#".format(conn.manager.server_type, conn.manager.version)
+ )
+
if where is None:
where_clause = "WHERE dep.objid={0}::oid".format(object_id)
else:
@@ -527,8 +530,11 @@ class PGChildNodeView(NodeView):
Returns: Dictionary of dependents for the selected node.
"""
# Set the sql_path
- sql_path = 'depends/{0}/#{1}#'.format(
- conn.manager.server_type, conn.manager.version)
+ sql_path = 'depends/' + (
+ "{0}/#{0}#{1}#".format(conn.manager.server_type, conn.manager.version) if
+ conn.manager.server_type == 'gpdb' else
+ "{0}/#{1}#".format(conn.manager.server_type, conn.manager.version)
+ )
if where is None:
where_clause = "WHERE dep.refobjid={0}::oid".format(object_id)
diff --git a/web/pgadmin/dashboard/templates/dashboard/sql/gpdb_6.0_plus/activity.sql b/web/pgadmin/dashboard/templates/dashboard/sql/gpdb_6.0_plus/activity.sql
new file mode 100644
index 0000000..f8a255e
--- /dev/null
+++ b/web/pgadmin/dashboard/templates/dashboard/sql/gpdb_6.0_plus/activity.sql
@@ -0,0 +1,19 @@
+/*pga4dash*/
+SELECT
+ pid,
+ datname,
+ usename,
+ application_name,
+ client_addr,
+ to_char(backend_start, 'YYYY-MM-DD HH24:MI:SS TZ') AS backend_start,
+ state,
+ CASE WHEN waiting THEN '{{ _('yes') }}' ELSE '{{ _('no') }}' END AS waiting,
+ waiting_reason AS wait_event,
+ query,
+ to_char(state_change, 'YYYY-MM-DD HH24:MI:SS TZ') AS state_change,
+ to_char(query_start, 'YYYY-MM-DD HH24:MI:SS TZ') AS query_start
+FROM
+ pg_stat_activity
+{% if did %}WHERE
+ datid = {{ did }} {% endif %}
+ORDER BY pid
\ No newline at end of file
diff --git a/web/pgadmin/dashboard/templates/dashboard/sql/gpdb_6.0_plus/dashboard_stats.sql b/web/pgadmin/dashboard/templates/dashboard/sql/gpdb_6.0_plus/dashboard_stats.sql
new file mode 100644
index 0000000..e0c4079
--- /dev/null
+++ b/web/pgadmin/dashboard/templates/dashboard/sql/gpdb_6.0_plus/dashboard_stats.sql
@@ -0,0 +1,57 @@
+/*pga4dash*/
+{% set add_union = false %}
+{% if 'session_stats' in chart_names %}
+{% set add_union = true %}
+SELECT 'session_stats' AS chart_name, row_to_json(t) AS chart_data
+FROM (SELECT
+ (SELECT count(*) FROM pg_stat_activity{% if did %} WHERE datid = {{ did }} {% endif %}) AS "{{ _('Total') }}",
+ (SELECT count(*) FROM pg_stat_activity WHERE state = 'active'{% if did %} AND datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Active') }}",
+ (SELECT count(*) FROM pg_stat_activity WHERE state = 'idle'{% if did %} AND datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Idle') }}"
+) t
+{% endif %}
+{% if add_union and 'tps_stats' in chart_names %}
+UNION ALL
+{% endif %}
+{% if 'tps_stats' in chart_names %}
+{% set add_union = true %}
+SELECT 'tps_stats' AS chart_name, row_to_json(t) AS chart_data
+FROM (SELECT
+ (SELECT sum(xact_commit) + sum(xact_rollback) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Transactions') }}",
+ (SELECT sum(xact_commit) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Commits') }}",
+ (SELECT sum(xact_rollback) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Rollbacks') }}"
+) t
+{% endif %}
+{% if add_union and 'ti_stats' in chart_names %}
+UNION ALL
+{% endif %}
+{% if 'ti_stats' in chart_names %}
+{% set add_union = true %}
+SELECT 'ti_stats' AS chart_name, row_to_json(t) AS chart_data
+FROM (SELECT
+ (SELECT sum(tup_inserted) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Inserts') }}",
+ (SELECT sum(tup_updated) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Updates') }}",
+ (SELECT sum(tup_deleted) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Deletes') }}"
+) t
+{% endif %}
+{% if add_union and 'to_stats' in chart_names %}
+UNION ALL
+{% endif %}
+{% if 'to_stats' in chart_names %}
+{% set add_union = true %}
+SELECT 'to_stats' AS chart_name, row_to_json(t) AS chart_data
+FROM (SELECT
+ (SELECT sum(tup_fetched) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Fetched') }}",
+ (SELECT sum(tup_returned) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Returned') }}"
+) t
+{% endif %}
+{% if add_union and 'bio_stats' in chart_names %}
+UNION ALL
+{% endif %}
+{% if 'bio_stats' in chart_names %}
+{% set add_union = true %}
+SELECT 'bio_stats' AS chart_name, row_to_json(t) AS chart_data
+FROM (SELECT
+ (SELECT sum(blks_read) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Reads') }}",
+ (SELECT sum(blks_hit) FROM pg_stat_database{% if did %} WHERE datname = (SELECT datname FROM pg_database WHERE oid = {{ did }}){% endif %}) AS "{{ _('Hits') }}"
+) t
+{% endif %}
diff --git a/web/pgadmin/utils/versioned_template_loader.py b/web/pgadmin/utils/versioned_template_loader.py
index bc32b36..6e1ed1e 100644
--- a/web/pgadmin/utils/versioned_template_loader.py
+++ b/web/pgadmin/utils/versioned_template_loader.py
@@ -12,6 +12,21 @@ from jinja2 import TemplateNotFound
class VersionedTemplateLoader(DispatchingJinjaLoader):
def get_source(self, environment, template):
+ '''
+ Should support the following template string format:
+
+ - connect/sql/9.0_plus/check_recovery.sql <= connect/sql/#xxx#/check_recovery.sql
+ - dashboard/sql/9.6_plus/activity.sql <= dashboard/sql/#xxx#/activity.sql
+ - dashboard/sql/gpdb_6.0_plus/activity.sql <= dashboard/sql/#xxx#xxx#/activity.sql
+ - table/sql/9.6_plus/properties.sql <= table/sql/#xxx#/properties.sql
+ - table/sql/gpdb_5.0_plus/properties.sql <= table/sql/#xxx#xxx#/properties.sql
+ - depends/pg/9.6_plus/role_dependencies.sql <= depends/xxx/#xxx#xxx#/role_dependencies.sql
+ - depends/gpdb/5_plus/role_dependencies.sql <= depends/xxx/#xxx#xxx#/role_dependencies.sql
+ - function/gpdb/sql/5_plus/get_definition.sql <= function/###/sql/#xxx#xxx#/get_definition.sql
+ - function/pg/sql/10_plus/get_definition.sql <= function/###/sql/#xxx#xxx#/get_definition.sql
+ - schemas/gpdb/5_plus/sql/acl.sql <= schemas/xxx/#xxx#xxx#/sql/acl.sql
+ - schemas/pg/9.6_plus/sql/acl.sql <= schemas/xxx/#xxx#/sql/acl.sql
+ '''
specified_version_number, exists = parse_version(template)
if not exists:
return super(VersionedTemplateLoader, self).get_source(
@@ -79,7 +94,9 @@ def get_version_mapping_directories(server_type):
"""
if server_type == 'gpdb':
return (
+ {'name': "gpdb_6.0_plus", 'number': 90424},
{'name': "gpdb_5.0_plus", 'number': 80323},
+ {'name': "6_plus", 'number': 90424},
{'name': "5_plus", 'number': 80323},
{'name': "default", 'number': 0}
)