From f63190dc93649bc9065c510fd048a1eb78706dfd Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Wed, 12 Feb 2025 16:14:31 +0530 Subject: [PATCH] Fixed an issue where pgAdmin does not support pg_vector column length/precision. #8181 --- docs/en_US/release_notes_9_1.rst | 1 + .../databases/schemas/tables/columns/utils.py | 3 ++- .../databases/schemas/types/__init__.py | 11 ++++++---- .../servers/databases/schemas/utils.py | 21 ++++++++----------- web/pgadmin/utils/constants.py | 11 +++++++++- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/docs/en_US/release_notes_9_1.rst b/docs/en_US/release_notes_9_1.rst index ad8a592b5..6c555fbd0 100644 --- a/docs/en_US/release_notes_9_1.rst +++ b/docs/en_US/release_notes_9_1.rst @@ -29,5 +29,6 @@ Housekeeping Bug fixes ********* + | `Issue #8181 `_ - Fixed an issue where pgAdmin does not support pg_vector column length/precision. | `Issue #8341 `_ - Fixed an issue where the query tool was not treating IDENTITY columns as columns with default values when inserting new rows. | `Issue #8410 `_ - Fixed Docker image entrypoint.sh email validation. \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py index 12e99e3c2..548339d3c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py @@ -441,7 +441,8 @@ def fetch_length_precision(data): precision = False if 'elemoid' in data: length, precision, _ = \ - DataTypeReader.get_length_precision(data['elemoid']) + DataTypeReader.get_length_precision(data['elemoid'], + data['typname']) # Set length and precision to None data['attlen'] = None diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py index f1a15bb3c..a757b825e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/__init__.py @@ -28,6 +28,7 @@ from pgadmin.utils.ajax import make_json_response, internal_server_error, \ from pgadmin.utils.driver import get_driver from pgadmin.tools.schema_diff.node_registry import SchemaDiffRegistry from pgadmin.tools.schema_diff.compare import SchemaDiffObjectCompare +from pgadmin.utils.constants import DATA_TYPE_WITH_LENGTH class TypeModule(SchemaChildModule): @@ -436,7 +437,8 @@ class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): properties_list.append(typelist) is_tlength, is_precision, _ = \ - self.get_length_precision(row.get('elemoid', None)) + self.get_length_precision(row.get('elemoid', None), + row.get('typname', None)) # Split length, precision from type name for grid t_len, t_prec = DataTypeReader.parse_length_precision( @@ -469,7 +471,8 @@ class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): :return: formatted response """ is_tlength, is_precision, _ = \ - self.get_length_precision(data.get('elemoid', None)) + self.get_length_precision(data.get('elemoid', None), + data.get('typname', None)) # Split length, precision from type name for grid t_len, t_prec = DataTypeReader.parse_length_precision( @@ -676,8 +679,8 @@ class TypeView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): for row in rset['rows']: # Check against PGOID for specific type if row['elemoid']: - if row['elemoid'] in (1560, 1561, 1562, 1563, 1042, 1043, - 1014, 1015): + if row['elemoid'] in DATA_TYPE_WITH_LENGTH or \ + row['typname'] in DATA_TYPE_WITH_LENGTH: typeval = 'L' elif row['elemoid'] in (1083, 1114, 1115, 1183, 1184, 1185, 1186, 1187, 1266, 1270): diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py index 35dbd52e0..a34ad6194 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py @@ -22,7 +22,8 @@ from config import PG_DEFAULT_DRIVER from pgadmin.utils.constants import DATATYPE_TIME_WITH_TIMEZONE,\ DATATYPE_TIME_WITHOUT_TIMEZONE,\ DATATYPE_TIMESTAMP_WITH_TIMEZONE,\ - DATATYPE_TIMESTAMP_WITHOUT_TIMEZONE + DATATYPE_TIMESTAMP_WITHOUT_TIMEZONE,\ + DATA_TYPE_WITH_LENGTH class SchemaChildModule(CollectionNodeModule): @@ -173,7 +174,7 @@ class DataTypeReader: # Check if the type will have length and precision or not if row['elemoid']: length, precision, typeval = self.get_length_precision( - row['elemoid']) + row['elemoid'], row['typname']) min_val, max_val = DataTypeReader._types_length_checks( length, typeval, precision) @@ -192,21 +193,16 @@ class DataTypeReader: return True, res @staticmethod - def get_length_precision(elemoid_or_name): + def get_length_precision(elemoid_or_name, typname=None): precision = False length = False typeval = '' # Check against PGOID/typename for specific type if elemoid_or_name: - if elemoid_or_name in (1560, 'bit', - 1561, 'bit[]', - 1562, 'varbit', 'bit varying', - 1563, 'varbit[]', 'bit varying[]', - 1042, 'bpchar', 'character', - 1043, 'varchar', 'character varying', - 1014, 'bpchar[]', 'character[]', - 1015, 'varchar[]', 'character varying[]'): + if (elemoid_or_name in DATA_TYPE_WITH_LENGTH or + typname is not None and + typname in DATA_TYPE_WITH_LENGTH): typeval = 'L' elif elemoid_or_name in (1083, 'time', DATATYPE_TIME_WITHOUT_TIMEZONE, @@ -267,7 +263,8 @@ class DataTypeReader: name == DATATYPE_TIMESTAMP_WITH_TIMEZONE or name == 'bit' or name == 'bit varying' or - name == 'varbit' + name == 'varbit' or name == 'vector' or name == 'halfvec' or + name == 'sparsevec' ): _prec = 0 _len = typmod diff --git a/web/pgadmin/utils/constants.py b/web/pgadmin/utils/constants.py index 5706a7e37..fa34bd6db 100644 --- a/web/pgadmin/utils/constants.py +++ b/web/pgadmin/utils/constants.py @@ -127,7 +127,6 @@ ACCESS_DENIED_MESSAGE = gettext( "Access denied: You’re having limited access. You’re not allowed to " "Rename, Delete or Create any files/folders") - KEY_RING_SERVICE_NAME = 'pgAdmin4' KEY_RING_USER_NAME = 'pgadmin4-master-password' KEY_RING_USERNAME_FORMAT = KEY_RING_SERVICE_NAME + '-{0}-{1}' @@ -150,3 +149,13 @@ IP_ADDRESS_STRING = '{}/{}' TWO_PARAM_STRING = '{0}/{1}' SERVER_NOT_FOUND = gettext("Could not find the specified server.") SSL_MODES = ['prefer', 'require', 'verify-ca', 'verify-full'] + +DATA_TYPE_WITH_LENGTH = [1560, 'bit', 1561, 'bit[]', + 1562, 'varbit', 'bit varying', + 1563, 'varbit[]', 'bit varying[]', + 1042, 'bpchar', 'character', + 1043, 'varchar', 'character varying', + 1014, 'bpchar[]', 'character[]', + 1015, 'varchar[]', 'character varying[]', + 'vector', 'vector[]', 'halfvec', 'halfvec[]', + 'sparsevec', 'sparsevec[]']