Ensure that indexes created by constraints are visible in the object explorer when "Show system objects" is enabled. #6717

This commit is contained in:
Akshay Joshi 2023-12-01 13:02:21 +05:30 committed by GitHub
parent f2876cabe8
commit 2b2ff0d260
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 58 additions and 18 deletions

View File

@ -30,6 +30,7 @@ Housekeeping
Bug fixes
*********
| `Issue #6717 <https://github.com/pgadmin-org/pgadmin4/issues/6717>`_ - Ensure that automatically created indexes should be shown in the treeview.
| `Issue #6803 <https://github.com/pgadmin-org/pgadmin4/issues/6803>`_ - Fixed an issue where reading process logs throws an error when DATA_DIR is moved to a networked drive.
| `Issue #6887 <https://github.com/pgadmin-org/pgadmin4/issues/6887>`_ - Fixed an issue where syntax error was not highlighting in query tool.
| `Issue #6921 <https://github.com/pgadmin-org/pgadmin4/issues/6921>`_ - Fixed an issue where on entering full screen, the option label is not changed to 'Exit Full Screen' in desktop mode.

View File

@ -384,7 +384,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
"""
SQL = render_template(
"/".join([self.template_path, self._NODES_SQL]), tid=tid
"/".join([self.template_path, self._NODES_SQL]), tid=tid,
show_sys_objects=self.blueprint.show_system_objects
)
status, res = self.conn.execute_dict(SQL)
@ -414,7 +415,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
"""
SQL = render_template(
"/".join([self.template_path, self._NODES_SQL]),
tid=tid, idx=idx
tid=tid, idx=idx,
show_sys_objects=self.blueprint.show_system_objects
)
status, rset = self.conn.execute_2darray(SQL)
if not status:
@ -453,7 +455,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
"""
res = []
SQL = render_template(
"/".join([self.template_path, self._NODES_SQL]), tid=tid
"/".join([self.template_path, self._NODES_SQL]), tid=tid,
show_sys_objects=self.blueprint.show_system_objects
)
status, rset = self.conn.execute_2darray(SQL)
if not status:
@ -511,7 +514,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
SQL = render_template(
"/".join([self.template_path, self._PROPERTIES_SQL]),
did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID,
show_sys_objects=self.blueprint.show_system_objects
)
status, res = self.conn.execute_dict(SQL)
@ -717,7 +721,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
SQL = render_template(
"/".join([self.template_path, self._PROPERTIES_SQL]),
did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID,
show_sys_objects=self.blueprint.show_system_objects
)
status, res = self.conn.execute_dict(SQL)
@ -774,7 +779,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
try:
SQL, name = index_utils.get_sql(
self.conn, data=data, did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID)
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID,
show_sys_objects=self.blueprint.show_system_objects)
if not isinstance(SQL, str):
return SQL
SQL = SQL.strip('\n').strip(' ')
@ -839,7 +845,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
try:
sql, name = index_utils.get_sql(
self.conn, data=data, did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID, mode='create')
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID, mode='create',
show_sys_objects=self.blueprint.show_system_objects)
if not isinstance(sql, str):
return sql
sql = sql.strip('\n').strip(' ')
@ -869,7 +876,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
SQL = index_utils.get_reverse_engineered_sql(
self.conn, schema=self.schema, table=self.table, did=did,
tid=tid, idx=idx, datlastsysoid=self._DATABASE_LAST_SYSTEM_OID,
add_not_exists_clause=True
add_not_exists_clause=True,
show_sys_objects=self.blueprint.show_system_objects
)
return ajax_response(response=SQL)
@ -899,7 +907,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
sql, name = index_utils.get_sql(
self.conn, data=data, did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID, mode='create')
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID, mode='create',
show_sys_objects=self.blueprint.show_system_objects)
sql = sql.strip('\n').strip(' ')
@ -909,7 +918,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
table=self.table, did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID,
template_path=None, with_header=False,
add_not_exists_clause=True
add_not_exists_clause=True,
show_sys_objects=self.blueprint.show_system_objects
)
drop_sql = ''
@ -1004,7 +1014,8 @@ class IndexesView(PGChildNodeView, SchemaDiffObjectCompare):
SQL = render_template(
"/".join([self.template_path, self._PROPERTIES_SQL]),
did=did, tid=tid, idx=idx,
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID
datlastsysoid=self._DATABASE_LAST_SYSTEM_OID,
show_sys_objects=self.blueprint.show_system_objects
)
status, res = self.conn.execute_dict(SQL)
if not status:

View File

@ -15,6 +15,12 @@ from pgadmin.utils.ajax import internal_server_error
from pgadmin.utils.exception import ObjectGone, ExecuteError
from functools import wraps
AUTO_CREATE_INDEX_MSG = "-- This primary key index is automatically " \
"generated from a constraint with an identical name.\n-- " \
"For more details, refer to the Constraints node. Note that this type " \
"of index is only visible \n-- when the 'Show system objects?' is set " \
"to True in the Preferences.\n\n"
def get_template_path(f):
"""
@ -233,12 +239,14 @@ def get_sql(conn, **kwargs):
mode = kwargs.get('mode', None)
template_path = kwargs.get('template_path', None)
if_exists_flag = kwargs.get('if_exists_flag', False)
show_sys_obj = kwargs.get('show_sys_objects', False)
name = data['name'] if 'name' in data else None
if idx is not None:
sql = render_template("/".join([template_path, 'properties.sql']),
did=did, tid=tid, idx=idx,
datlastsysoid=datlastsysoid)
datlastsysoid=datlastsysoid,
show_sys_objects=show_sys_obj)
status, res = conn.execute_dict(sql)
if not status:
@ -300,10 +308,12 @@ def get_reverse_engineered_sql(conn, **kwargs):
template_path = kwargs.get('template_path', None)
with_header = kwargs.get('with_header', True)
if_exists_flag = kwargs.get('add_not_exists_clause', False)
show_sys_obj = kwargs.get('show_sys_objects', False)
SQL = render_template("/".join([template_path, 'properties.sql']),
did=did, tid=tid, idx=idx,
datlastsysoid=datlastsysoid)
datlastsysoid=datlastsysoid,
show_sys_objects=show_sys_obj)
status, res = conn.execute_dict(SQL)
if not status:
@ -336,7 +346,12 @@ def get_reverse_engineered_sql(conn, **kwargs):
if_exists_flag=if_exists_flag)
if with_header:
sql_header = "-- Index: {0}\n\n-- ".format(data['name'])
sql_header = ''
# Add a Note if index is automatically created.
if 'conname' in data and data['conname'] is not None:
sql_header += AUTO_CREATE_INDEX_MSG
sql_header += "-- Index: {0}\n\n-- ".format(data['name'])
sql_header += render_template("/".join([template_path, 'delete.sql']),
data=data, conn=conn)

View File

@ -4,7 +4,7 @@ SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name, indrelid, indkey,
(SELECT sp.spcname FROM pg_catalog.pg_database dtb
JOIN pg_catalog.pg_tablespace sp ON dtb.dattablespace=sp.oid
WHERE dtb.oid = {{ did }}::oid)
END as spcname,
END as spcname, conname,
tab.relname as tabname, indclass, con.oid AS conoid,
CASE WHEN contype IN ('p', 'u', 'x') THEN desp.description
ELSE des.description END AS description,
@ -29,6 +29,8 @@ FROM pg_catalog.pg_index idx
LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=cls.oid AND des.classoid='pg_class'::regclass)
LEFT OUTER JOIN pg_catalog.pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0 AND desp.classoid='pg_constraint'::regclass)
WHERE indrelid = {{tid}}::OID
{% if not show_sys_objects %}
AND conname is NULL
{% endif %}
{% if idx %}AND cls.oid = {{idx}}::OID {% endif %}
ORDER BY cls.relname

View File

@ -4,7 +4,7 @@ SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name, indrelid, indkey,
(SELECT sp.spcname FROM pg_catalog.pg_database dtb
JOIN pg_catalog.pg_tablespace sp ON dtb.dattablespace=sp.oid
WHERE dtb.oid = {{ did }}::oid)
END as spcname,
END as spcname, conname,
tab.relname as tabname, indclass, con.oid AS conoid,
CASE WHEN contype IN ('p', 'u', 'x') THEN desp.description
ELSE des.description END AS description,
@ -30,6 +30,8 @@ FROM pg_catalog.pg_index idx
LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=cls.oid AND des.classoid='pg_class'::regclass)
LEFT OUTER JOIN pg_catalog.pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0 AND desp.classoid='pg_constraint'::regclass)
WHERE indrelid = {{tid}}::OID
{% if not show_sys_objects %}
AND conname is NULL
{% endif %}
{% if idx %}AND cls.oid = {{idx}}::OID {% endif %}
ORDER BY cls.relname

View File

@ -4,7 +4,7 @@ SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name, indrelid, indkey,
(SELECT sp.spcname FROM pg_catalog.pg_database dtb
JOIN pg_catalog.pg_tablespace sp ON dtb.dattablespace=sp.oid
WHERE dtb.oid = {{ did }}::oid)
END as spcname,
END as spcname, conname,
tab.relname as tabname, indclass, con.oid AS conoid,
CASE WHEN contype IN ('p', 'u', 'x') THEN desp.description
ELSE des.description END AS description,
@ -30,6 +30,8 @@ FROM pg_catalog.pg_index idx
LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=cls.oid AND des.classoid='pg_class'::regclass)
LEFT OUTER JOIN pg_catalog.pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0 AND desp.classoid='pg_constraint'::regclass)
WHERE indrelid = {{tid}}::OID
{% if not show_sys_objects %}
AND conname is NULL
{% endif %}
{% if idx %}AND cls.oid = {{idx}}::OID {% endif %}
ORDER BY cls.relname

View File

@ -4,4 +4,7 @@ FROM pg_catalog.pg_index idx
LEFT JOIN pg_catalog.pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0' AND dep.refclassid=(SELECT oid FROM pg_catalog.pg_class WHERE relname='pg_constraint') AND dep.deptype='i')
LEFT OUTER JOIN pg_catalog.pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid)
WHERE indrelid = {{tid}}::OID
{### To show system objects ###}
{% if not showsysobj %}
AND conname is NULL
{% endif %}

View File

@ -12,7 +12,9 @@ FROM pg_catalog.pg_index idx
LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=cls.oid AND des.classoid='pg_class'::regclass)
LEFT OUTER JOIN pg_catalog.pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0 AND desp.classoid='pg_constraint'::regclass)
WHERE indrelid = {{tid}}::OID
{% if not show_sys_objects %}
AND conname is NULL
{% endif %}
{% if idx %}
AND cls.oid = {{ idx }}::OID
{% endif %}

View File

@ -4,7 +4,7 @@ SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as name, indrelid, indkey,
(SELECT sp.spcname FROM pg_catalog.pg_database dtb
JOIN pg_catalog.pg_tablespace sp ON dtb.dattablespace=sp.oid
WHERE dtb.oid = {{ did }}::oid)
END as spcname,
END as spcname, conname,
tab.relname as tabname, indclass, con.oid AS conoid,
CASE WHEN contype IN ('p', 'u', 'x') THEN desp.description
ELSE des.description END AS description,
@ -23,6 +23,8 @@ FROM pg_catalog.pg_index idx
LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=cls.oid AND des.classoid='pg_class'::regclass)
LEFT OUTER JOIN pg_catalog.pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0 AND desp.classoid='pg_constraint'::regclass)
WHERE indrelid = {{tid}}::OID
{% if not show_sys_objects %}
AND conname is NULL
{% endif %}
{% if idx %}AND cls.oid = {{idx}}::OID {% endif %}
ORDER BY cls.relname