From 4fa1bdba5a7eb8f8bc6d3fb5992e2fa7a27aa08d Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Thu, 28 Nov 2019 18:48:53 +0530 Subject: [PATCH] =?UTF-8?q?1)=20Refactored=20code=20of=20columns=20node.?= =?UTF-8?q?=20Fixes=20#4938.=202)=20Fix=20an=20issue=20where=20length=20an?= =?UTF-8?q?d=20precision=20are=20not=20removed=20from=20table/column=20dia?= =?UTF-8?q?log.=20Fixes=20#4964.=203)=20Fix=20an=20issue=20where=20the=20I?= =?UTF-8?q?nterval=20data=20type=20is=20not=20displayed=20in=20the=20prope?= =?UTF-8?q?rties=20dialog=20of=20table/column.=20Fixes=20#4965.=204)=20Fix?= =?UTF-8?q?=20an=20issue=20where=20the=20wrong=20type=20is=20displayed=20w?= =?UTF-8?q?hen=20changing=20the=20datatype=20from=C2=A0timestamp=20with=20?= =?UTF-8?q?time=20zone=20to=20timestamp=20without=20time=20zone.=20Fixes?= =?UTF-8?q?=20#4761.=205)=20Change=C2=A0the=20label=20from=20'Length=20and?= =?UTF-8?q?=20Precision'=20to=20'Length/Precision=20and=20Scale'=20for=20c?= =?UTF-8?q?olumns.=206)=20The=20maximum=20length=20for=20datatype=20like?= =?UTF-8?q?=20interval,=20timestamp=20with=20time=20zone,=20time=20with=20?= =?UTF-8?q?time=20zone,=20etc..=20is=206.=20Set=20the=20max=20length=20to?= =?UTF-8?q?=206=20instead=20of=2010.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en_US/column_dialog.rst | 2 +- docs/en_US/images/column_definition.png | Bin 44189 -> 51024 bytes docs/en_US/images/table_columns.png | Bin 45459 -> 64205 bytes docs/en_US/release_notes_4_16.rst | 4 + docs/en_US/table_dialog.rst | 6 +- .../databases/schemas/tables/__init__.py | 77 +--- .../schemas/tables/columns/__init__.py | 226 +---------- .../tables/columns/static/js/column.js | 42 +- .../tests/10_plus/alter_column_char.sql | 2 +- .../tests/10_plus/alter_column_numeric.sql | 2 +- .../10_plus/alter_column_remove_length.sql | 15 + .../tables/columns/tests/10_plus/test.json | 13 +- .../tests/12_plus/alter_column_char.sql | 2 +- .../tests/12_plus/alter_column_numeric.sql | 2 +- .../12_plus/alter_column_remove_length.sql | 15 + .../tables/columns/tests/12_plus/test.json | 13 +- .../tests/default/alter_column_char.sql | 2 +- .../tests/default/alter_column_numeric.sql | 2 +- .../default/alter_column_remove_length.sql | 15 + .../tables/columns/tests/default/test.json | 13 +- .../tables/columns/tests/test_column_msql.py | 12 +- .../databases/schemas/tables/columns/utils.py | 360 ++++++++++++++++++ .../schemas/tables/compound_triggers/utils.py | 2 +- .../constraints/index_constraint/utils.py | 2 +- .../templates/columns/sql/10_plus/update.sql | 2 +- .../templates/columns/sql/9.2_plus/update.sql | 3 +- .../templates/columns/sql/default/update.sql | 2 +- .../schemas/tables/triggers/utils.py | 2 +- .../servers/databases/schemas/tables/utils.py | 276 +------------- .../databases/schemas/types/static/js/type.js | 8 +- .../macros/get_full_type_sql_format.macros | 33 +- .../servers/databases/schemas/utils.py | 18 +- 32 files changed, 571 insertions(+), 602 deletions(-) mode change 100755 => 100644 docs/en_US/images/table_columns.png create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_remove_length.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_remove_length.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_remove_length.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py diff --git a/docs/en_US/column_dialog.rst b/docs/en_US/column_dialog.rst index 3b41c5bf0..26c5a8782 100644 --- a/docs/en_US/column_dialog.rst +++ b/docs/en_US/column_dialog.rst @@ -34,7 +34,7 @@ are disabled if inapplicable.) column. For more information on the data types that are supported by PostgreSQL, refer to Chapter 8 of the Postgres core documentation. This field is required. -* Use the *Length* and *Precision* fields to specify the maximum number of +* Use the *Length/Precision* and *Scale* fields to specify the maximum number of significant digits in a numeric value, or the maximum number of characters in a text value. * Use the drop-down listbox next to *Collation* to apply a collation setting to diff --git a/docs/en_US/images/column_definition.png b/docs/en_US/images/column_definition.png index e72ac61bed67f023a358822f21e83ee1fc2ef094..dc6c031062685186aa37ac353ff3776d0fa2ccfb 100644 GIT binary patch literal 51024 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 diff --git a/docs/en_US/images/table_columns.png b/docs/en_US/images/table_columns.png old mode 100755 new mode 100644 index c760bef65c8880b6f9b8d9b25cedb4d67fe0617f..fc47b0b0213ff398c407b8b9b762eb039144e792 GIT binary patch literal 64205 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 literal 45459 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≷4^mI$-~h4&28K9^pZ7qG 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 diff --git a/docs/en_US/release_notes_4_16.rst b/docs/en_US/release_notes_4_16.rst index a6349feb1..491c0d921 100644 --- a/docs/en_US/release_notes_4_16.rst +++ b/docs/en_US/release_notes_4_16.rst @@ -15,6 +15,7 @@ Housekeeping | `Issue #4696 `_ - Add Reverse Engineered and Modified SQL tests for Materialized Views. | `Issue #4807 `_ - Refactored code of table and it's child nodes. +| `Issue #4938 `_ - Refactored code of columns node. Bug fixes ********* @@ -22,6 +23,7 @@ Bug fixes | `Issue #3538 `_ - Fix issue where the Reset button does not get enabled till all the mandatory fields are provided in the dialog. | `Issue #4659 `_ - Updated documentation for default privileges to clarify more on the grantor. | `Issue #4724 `_ - Fix network disconnect issue while establishing the connection via SSH Tunnel and it impossible to expand the Servers node. +| `Issue #4761 `_ - Fix an issue where the wrong type is displayed when changing the datatype from timestamp with time zone to timestamp without time zone. | `Issue #4792 `_ - Ensure that the superuser should be able to create database, as the superuser overrides all the access restrictions. | `Issue #4818 `_ - Fix server connection drops out issue in query tool. | `Issue #4836 `_ - Updated the json file name from 'servers.json' to 'pgadmin4/servers.json' in the container deployment section of the documentation. @@ -32,3 +34,5 @@ Bug fixes | `Issue #4933 `_ - Ensure that the Servers collection node should expand independently of server connections. | `Issue #4934 `_ - Fix the help button link on the User Management dialog. | `Issue #4935 `_ - Fix accessibility issues. +| `Issue #4964 `_ - Fix an issue where length and precision are not removed from table/column dialog. +| `Issue #4965 `_ - Fix an issue where the Interval data type is not displayed in the properties dialog of table/column. diff --git a/docs/en_US/table_dialog.rst b/docs/en_US/table_dialog.rst index 529b0c13d..45648b3c7 100644 --- a/docs/en_US/table_dialog.rst +++ b/docs/en_US/table_dialog.rst @@ -50,9 +50,9 @@ the *Columns* table: the column. This can include array specifiers. For more information on the data types supported by PostgreSQL, refer to Chapter 8 of the core documentation. -* If enabled, use the *Length* and *Precision* fields to specify the maximum - number of significant digits in a numeric value, or the maximum number of - characters in a text value. +* If enabled, use the *Length/Precision* and *Scale* fields to specify the + maximum number of significant digits in a numeric value, or the maximum + number of characters in a text value. * Move the *Not NULL?* switch to the *Yes* position to require a value in the column field. * Move the *Primary key?* switch to the *Yes* position to specify the column is diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py index f3c91f6ea..b6e0b5f20 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py @@ -24,6 +24,8 @@ from .utils import BaseTableView from pgadmin.utils.preferences import Preferences 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.\ + columns import utils as column_utils class TableModule(SchemaChildModule): @@ -210,10 +212,6 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings): * get_toast_table_vacuum(gid, sid, did, scid=None, tid=None) - Fetch the default values for toast table auto-vacuum - * _parse_format_columns(self, data, mode=None): - - This function will parse and return formatted list of columns - added by user - * get_index_constraint_sql(self, did, tid, data): - This function will generate modified sql for index constraints (Primary Key & Unique) @@ -886,75 +884,6 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings): except Exception as e: return internal_server_error(errormsg=str(e)) - def _parse_format_columns(self, data, mode=None): - """ - data: - Data coming from client side - - Returns: - This function will parse and return formatted list of columns - added by user - """ - columns = data['columns'] - # 'EDIT' mode - if mode is not None: - for action in ['added', 'changed']: - if action in columns: - final_columns = [] - for c in columns[action]: - if 'inheritedfrom' not in c: - final_columns.append(c) - - for c in final_columns: - if 'attacl' in c: - if 'added' in c['attacl']: - c['attacl']['added'] = parse_priv_to_db( - c['attacl']['added'], self.column_acl - ) - elif 'changed' in c['attacl']: - c['attacl']['changed'] = parse_priv_to_db( - c['attacl']['changed'], self.column_acl - ) - elif 'deleted' in c['attacl']: - c['attacl']['deleted'] = parse_priv_to_db( - c['attacl']['deleted'], self.column_acl - ) - if 'cltype' in c: - # check type for '[]' in it - c['cltype'], c['hasSqrBracket'] = \ - self._cltype_formatter(c['cltype']) - - c = TableView.convert_length_precision_to_string(c) - - data['columns'][action] = final_columns - else: - # We need to exclude all the columns which are inherited from other - # tables 'CREATE' mode - final_columns = [] - - for c in columns: - if 'inheritedfrom' not in c: - final_columns.append(c) - - # Now we have all lis of columns which we need - # to include in our create definition, Let's format them - for c in final_columns: - if 'attacl' in c: - c['attacl'] = parse_priv_to_db( - c['attacl'], self.column_acl - ) - - if 'cltype' in c: - # check type for '[]' in it - c['cltype'], c['hasSqrBracket'] = \ - self._cltype_formatter(c['cltype']) - - c = TableView.convert_length_precision_to_string(c) - - data['columns'] = final_columns - - return data - @BaseTableView.check_precondition def create(self, gid, sid, did, scid): """ @@ -1000,7 +929,7 @@ class TableView(BaseTableView, DataTypeReader, VacuumSettings): data['relacl'] = parse_priv_to_db(data['relacl'], self.acl) # Parse & format columns - data = self._parse_format_columns(data) + data = column_utils.parse_format_columns(data) data = TableView.check_and_convert_name_to_string(data) # 'coll_inherits' is Array but it comes as string from browser diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py index 462d7978f..ee082810b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py @@ -23,6 +23,8 @@ from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \ 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.\ + columns import utils as column_utils from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER from pgadmin.utils import IS_PY2 @@ -215,16 +217,9 @@ class ColumnsView(PGChildNodeView, DataTypeReader): self.acl = ['a', 'r', 'w', 'x'] # We need parent's name eg table name and schema name - SQL = render_template("/".join([self.template_path, - 'get_parent.sql']), - tid=kwargs['tid']) - status, rset = self.conn.execute_2darray(SQL) - if not status: - return internal_server_error(errormsg=rset) - - for row in rset['rows']: - self.schema = row['schema'] - self.table = row['table'] + schema, table = column_utils.get_parent(self.conn, kwargs['tid']) + self.schema = schema + self.table = table return f(*args, **kwargs) @@ -319,138 +314,6 @@ class ColumnsView(PGChildNodeView, DataTypeReader): status=200 ) - def _formatter(self, scid, tid, clid, data): - """ - Args: - scid: schema oid - tid: table oid - clid: position of column in table - data: dict of query result - - Returns: - It will return formatted output of collections - """ - # To check if column is primary key - if 'attnum' in data and 'indkey' in data: - # Current column - attnum = str(data['attnum']) - - # Single/List of primary key column(s) - indkey = str(data['indkey']) - - # We will check if column is in primary column(s) - if attnum in indkey.split(" "): - data['is_pk'] = True - else: - data['is_pk'] = False - - # Find length & precision of column data type - fulltype = self.get_full_type( - data['typnspname'], data['typname'], - data['isdup'], data['attndims'], data['atttypmod'] - ) - - length = False - precision = False - if 'elemoid' in data: - length, precision, typeval = \ - self.get_length_precision(data['elemoid']) - - # Set length and precision to None - data['attlen'] = None - data['attprecision'] = None - - import re - - # If we have length & precision both - if length and precision: - matchObj = re.search(r'(\d+),(\d+)', fulltype) - if matchObj: - data['attlen'] = matchObj.group(1) - data['attprecision'] = matchObj.group(2) - elif length: - # If we have length only - matchObj = re.search(r'(\d+)', fulltype) - if matchObj: - data['attlen'] = matchObj.group(1) - data['attprecision'] = None - - # We need to fetch inherited tables for each table - SQL = render_template("/".join([self.template_path, - 'get_inherited_tables.sql']), - tid=tid) - status, inh_res = self.conn.execute_dict(SQL) - if not status: - return internal_server_error(errormsg=inh_res) - for row in inh_res['rows']: - if row['attrname'] == data['name']: - data['is_inherited'] = True - data['tbls_inherited'] = row['inhrelname'] - - # We need to format variables according to client js collection - if 'attoptions' in data and data['attoptions'] is not None: - spcoptions = [] - for spcoption in data['attoptions']: - k, v = spcoption.split('=') - spcoptions.append({'name': k, 'value': v}) - - data['attoptions'] = spcoptions - - # Need to format security labels according to client js collection - if 'seclabels' in data and data['seclabels'] is not None: - seclabels = [] - for seclbls in data['seclabels']: - k, v = seclbls.split('=') - seclabels.append({'provider': k, 'label': v}) - - data['seclabels'] = seclabels - - # We need to parse & convert ACL coming from database to json format - SQL = render_template("/".join([self.template_path, 'acl.sql']), - tid=tid, clid=clid) - status, acl = self.conn.execute_dict(SQL) - - if not status: - return internal_server_error(errormsg=acl) - - # We will set get privileges from acl sql so we don't need - # it from properties sql - data['attacl'] = [] - - for row in acl['rows']: - priv = parse_priv_from_db(row) - data.setdefault(row['deftype'], []).append(priv) - - # we are receiving request when in edit mode - # we will send filtered types related to current type - type_id = data['atttypid'] - - SQL = render_template("/".join([self.template_path, - 'is_referenced.sql']), - tid=tid, clid=clid) - - status, is_reference = self.conn.execute_scalar(SQL) - - edit_types_list = list() - # We will need present type in edit mode - edit_types_list.append(data['cltype']) - - if int(is_reference) == 0: - SQL = render_template( - "/".join([self.template_path, 'edit_mode_types.sql']), - type_id=type_id - ) - status, rset = self.conn.execute_2darray(SQL) - - for row in rset['rows']: - edit_types_list.append(row['typname']) - - data['edit_types'] = edit_types_list - - data['cltype'] = DataTypeReader.parse_type_name(data['cltype']) - - return data - @check_precondition def properties(self, gid, sid, did, scid, tid, clid): """ @@ -485,61 +348,13 @@ class ColumnsView(PGChildNodeView, DataTypeReader): # Making copy of output for future use data = dict(res['rows'][0]) - data = self._formatter(scid, tid, clid, data) + data = column_utils.column_formatter(self.conn, tid, clid, data) return ajax_response( response=data, status=200 ) - def _cltype_formatter(self, type): - """ - - Args: - data: Type string - - Returns: - We need to remove [] from type and append it - after length/precision so we will set flag for - sql template - """ - - if '[]' in type: - type = type.replace('[]', '') - self.hasSqrBracket = True - else: - self.hasSqrBracket = False - - return type - - @staticmethod - def convert_length_precision_to_string(data): - """ - This function is used to convert length & precision to string - to handle case like when user gives 0 as length - - Args: - data: Data from client - - Returns: - Converted data - """ - - # We need to handle the below case because jquery has changed - # undefined/null values to empty strings - # https://github.com/jquery/jquery/commit/36d2d9ae937f626d98319ed850905e8d1cbfd078 - if 'attlen' in data and data['attlen'] == '': - data['attlen'] = None - elif 'attlen' in data and data['attlen'] is not None: - data['attlen'] = str(data['attlen']) - - if 'attprecision' in data and data['attprecision'] == '': - data['attprecision'] = None - elif 'attprecision' in data and data['attprecision'] is not None: - data['attprecision'] = str(data['attprecision']) - - return data - @check_precondition def create(self, gid, sid, did, scid, tid): """ @@ -590,9 +405,9 @@ class ColumnsView(PGChildNodeView, DataTypeReader): data['table'] = self.table # check type for '[]' in it - data['cltype'] = self._cltype_formatter(data['cltype']) - data['hasSqrBracket'] = self.hasSqrBracket - data = self.convert_length_precision_to_string(data) + data['cltype'], data['hasSqrBracket'] = \ + column_utils.type_formatter(data['cltype']) + data = column_utils.convert_length_precision_to_string(data) SQL = render_template("/".join([self.template_path, 'create.sql']), @@ -711,8 +526,8 @@ class ColumnsView(PGChildNodeView, DataTypeReader): # check type for '[]' in it if 'cltype' in data: - data['cltype'] = self._cltype_formatter(data['cltype']) - data['hasSqrBracket'] = self.hasSqrBracket + data['cltype'], data['hasSqrBracket'] = \ + column_utils.type_formatter(data['cltype']) SQL, name = self.get_sql(scid, tid, clid, data) if not isinstance(SQL, (str, unicode)): @@ -754,8 +569,8 @@ class ColumnsView(PGChildNodeView, DataTypeReader): # check type for '[]' in it if 'cltype' in data: - data['cltype'] = self._cltype_formatter(data['cltype']) - data['hasSqrBracket'] = self.hasSqrBracket + data['cltype'], data['hasSqrBracket'] = \ + column_utils.type_formatter(data['cltype']) try: SQL, name = self.get_sql(scid, tid, clid, data) @@ -776,7 +591,7 @@ class ColumnsView(PGChildNodeView, DataTypeReader): """ This function will genrate sql from model data """ - data = self.convert_length_precision_to_string(data) + data = column_utils.convert_length_precision_to_string(data) if clid is not None: SQL = render_template( @@ -794,12 +609,13 @@ class ColumnsView(PGChildNodeView, DataTypeReader): ) old_data = dict(res['rows'][0]) # We will add table & schema as well - old_data = self._formatter(scid, tid, clid, old_data) + old_data = column_utils.column_formatter( + self.conn, tid, clid, old_data) # check type for '[]' in it if 'cltype' in old_data: - old_data['cltype'] = self._cltype_formatter(old_data['cltype']) - old_data['hasSqrBracket'] = self.hasSqrBracket + old_data['cltype'], old_data['hasSqrBracket'] = \ + column_utils.type_formatter(old_data['cltype']) if 'cltype' in data and data['cltype'] != old_data['cltype']: length, precision, typeval = \ @@ -897,11 +713,11 @@ class ColumnsView(PGChildNodeView, DataTypeReader): data['table'] = self.table # check type for '[]' in it if 'cltype' in data: - data['cltype'] = self._cltype_formatter(data['cltype']) - data['hasSqrBracket'] = self.hasSqrBracket + data['cltype'], data['hasSqrBracket'] = \ + column_utils.type_formatter(data['cltype']) # We will add table & schema as well - data = self._formatter(scid, tid, clid, data) + data = column_utils.column_formatter(self.conn, tid, clid, data) SQL, name = self.get_sql(scid, tid, None, data, is_sql=True) if not isinstance(SQL, (str, unicode)): diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js index a045dc782..62086583d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/static/js/column.js @@ -176,8 +176,10 @@ define('pgadmin.node.column', [ attacl: undefined, description: undefined, parent_tbl: undefined, - min_val: undefined, - max_val: undefined, + min_val_attlen: undefined, + min_val_attprecision: undefined, + max_val_attlen: undefined, + max_val_attprecision: undefined, edit_types: undefined, is_primary_key: false, inheritedfrom: undefined, @@ -348,7 +350,7 @@ define('pgadmin.node.column', [ return _.isUndefined(m.top.node_info['table'] || m.top.node_info['view'] || m.top.node_info['mview']); }, },{ - id: 'attlen', label: gettext('Length'), cell: IntegerDepCell, + id: 'attlen', label: gettext('Length/Precision'), cell: IntegerDepCell, deps: ['cltype'], type: 'int', group: gettext('Definition'), cellHeaderClasses:'width_percent_20', disabled: function(m) { var of_type = m.get('cltype'), @@ -357,8 +359,8 @@ define('pgadmin.node.column', [ if ( of_type == o.value ) { if(o.length) { - m.set('min_val', o.min_val, {silent: true}); - m.set('max_val', o.max_val, {silent: true}); + m.set('min_val_attlen', o.min_val, {silent: true}); + m.set('max_val_attlen', o.max_val, {silent: true}); flag = false; } } @@ -388,8 +390,8 @@ define('pgadmin.node.column', [ _.each(m.datatypes, function(o) { if ( of_type == o.value ) { if(o.length) { - m.set('min_val', o.min_val, {silent: true}); - m.set('max_val', o.max_val, {silent: true}); + m.set('min_val_attlen', o.min_val, {silent: true}); + m.set('max_val_attlen', o.max_val, {silent: true}); flag = true; } } @@ -404,7 +406,7 @@ define('pgadmin.node.column', [ return flag; }, },{ - id: 'attprecision', label: gettext('Precision'), cell: IntegerDepCell, + id: 'attprecision', label: gettext('Scale'), cell: IntegerDepCell, deps: ['cltype'], type: 'int', group: gettext('Definition'), cellHeaderClasses:'width_percent_20', disabled: function(m) { var of_type = m.get('cltype'), @@ -412,8 +414,8 @@ define('pgadmin.node.column', [ _.each(m.datatypes, function(o) { if ( of_type == o.value ) { if(o.precision) { - m.set('min_val', 0, {silent: true}); - m.set('max_val', o.max_val, {silent: true}); + m.set('min_val_attprecision', 0, {silent: true}); + m.set('max_val_attprecision', o.max_val, {silent: true}); flag = false; } } @@ -442,8 +444,8 @@ define('pgadmin.node.column', [ _.each(m.datatypes, function(o) { if ( of_type == o.value ) { if(o.precision) { - m.set('min_val', 0, {silent: true}); - m.set('max_val', o.max_val, {silent: true}); + m.set('min_val_attprecision', 0, {silent: true}); + m.set('max_val_attprecision', o.max_val, {silent: true}); flag = true; } } @@ -722,10 +724,10 @@ define('pgadmin.node.column', [ && !_.isNull(this.get('attlen')) && this.get('attlen') !== '') { // Validation for Length field - if (this.get('attlen') < this.get('min_val')) - msg = gettext('Length should not be less than: ') + this.get('min_val'); - if (this.get('attlen') > this.get('max_val')) - msg = gettext('Length should not be greater than: ') + this.get('max_val'); + if (this.get('attlen') < this.get('min_val_attlen')) + msg = gettext('Length/Precision should not be less than: ') + this.get('min_val_attlen'); + if (this.get('attlen') > this.get('max_val_attlen')) + msg = gettext('Length/Precision should not be greater than: ') + this.get('max_val_attlen'); // If we have any error set then throw it to user if(msg) { this.errorModel.set('attlen', msg); @@ -738,10 +740,10 @@ define('pgadmin.node.column', [ && !_.isNull(this.get('attprecision')) && this.get('attprecision') !== '') { // Validation for precision field - if (this.get('attprecision') < this.get('min_val')) - msg = gettext('Precision should not be less than: ') + this.get('min_val'); - if (this.get('attprecision') > this.get('max_val')) - msg = gettext('Precision should not be greater than: ') + this.get('max_val'); + if (this.get('attprecision') < this.get('min_val_attprecision')) + msg = gettext('Scale should not be less than: ') + this.get('min_val_attprecision'); + if (this.get('attprecision') > this.get('max_val_attprecision')) + msg = gettext('Scale should not be greater than: ') + this.get('max_val_attprecision'); // If we have any error set then throw it to user if(msg) { this.errorModel.set('attprecision', msg); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_char.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_char.sql index c5b9b23c8..d5cb65e8f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_char.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_char.sql @@ -3,7 +3,7 @@ -- ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#"; ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" - ADD COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#" character(50) COLLATE pg_catalog."C"; + ADD COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#" character(1) COLLATE pg_catalog."C"; COMMENT ON COLUMN testschema."table_2_$%{}[]()&*^!@""'`\/#"."new_col_2_$%{}[]()&*^!@""'`\/#" IS 'Comment for alter'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_numeric.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_numeric.sql index eeceb9e61..95817ad62 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_numeric.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_numeric.sql @@ -3,7 +3,7 @@ -- ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_4_$%{}[]()&*^!@""'`\/#"; ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" - ADD COLUMN "new_col_4_$%{}[]()&*^!@""'`\/#" numeric(15,0) NOT NULL; + ADD COLUMN "new_col_4_$%{}[]()&*^!@""'`\/#" numeric(15,6) NOT NULL; COMMENT ON COLUMN testschema."table_2_$%{}[]()&*^!@""'`\/#"."new_col_4_$%{}[]()&*^!@""'`\/#" IS 'Comment for alter'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_remove_length.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_remove_length.sql new file mode 100644 index 000000000..5506f2974 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/alter_column_remove_length.sql @@ -0,0 +1,15 @@ +-- Column: testschema."table_2_$%{}[]()&*^!@""'`\/#"."new_col_4_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_4_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "new_col_4_$%{}[]()&*^!@""'`\/#" numeric NOT NULL; + +COMMENT ON COLUMN testschema."table_2_$%{}[]()&*^!@""'`\/#"."new_col_4_$%{}[]()&*^!@""'`\/#" + IS 'Comment for alter'; + +ALTER TABLE testschema."table_2_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "new_col_4_$%{}[]()&*^!@""'`\/#" + SET (n_distinct=1); + +GRANT ALL("new_col_4_$%{}[]()&*^!@""'`\/#") ON testschema."table_2_$%{}[]()&*^!@""'`\/#" TO PUBLIC; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/test.json index 09844ec97..cfeddca04 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/10_plus/test.json @@ -195,12 +195,23 @@ "name": "new_col_4_$%{}[]()&*^!@\"'`\\/#", "attnum": 4, "attlen":"15", - "attprecision":"0", + "attprecision":"6", "description": "Comment for alter", "attacl":{"added":[{"grantee":"PUBLIC","grantor":"postgres","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false}]}]} }, "expected_sql_file": "alter_column_numeric.sql" }, + { + "type": "alter", + "name": "Alter Column (Remove Length)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "attnum": 3, + "attlen":"" + }, + "expected_sql_file": "alter_column_remove_length.sql" + }, { "type": "delete", "name": "Drop Column (Numeric type with Length Precision & Variables)", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_char.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_char.sql index 1fe2b7a88..b4274272c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_char.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_char.sql @@ -3,7 +3,7 @@ -- ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#"; ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" - ADD COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#" character(50) COLLATE pg_catalog."C"; + ADD COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#" character(1) COLLATE pg_catalog."C"; COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."new_col_2_$%{}[]()&*^!@""'`\/#" IS 'Comment for alter'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_numeric.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_numeric.sql index 5fff0f3c9..c34bfc7fc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_numeric.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_numeric.sql @@ -3,7 +3,7 @@ -- ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_5_$%{}[]()&*^!@""'`\/#"; ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" - ADD COLUMN "new_col_5_$%{}[]()&*^!@""'`\/#" numeric(15,0) NOT NULL; + ADD COLUMN "new_col_5_$%{}[]()&*^!@""'`\/#" numeric(15,6) NOT NULL; COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."new_col_5_$%{}[]()&*^!@""'`\/#" IS 'Comment for alter'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_remove_length.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_remove_length.sql new file mode 100644 index 000000000..686ebf3c3 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/alter_column_remove_length.sql @@ -0,0 +1,15 @@ +-- Column: testschema."table_3_$%{}[]()&*^!@""'`\/#"."new_col_5_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_5_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "new_col_5_$%{}[]()&*^!@""'`\/#" numeric NOT NULL; + +COMMENT ON COLUMN testschema."table_3_$%{}[]()&*^!@""'`\/#"."new_col_5_$%{}[]()&*^!@""'`\/#" + IS 'Comment for alter'; + +ALTER TABLE testschema."table_3_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "new_col_5_$%{}[]()&*^!@""'`\/#" + SET (n_distinct=1); + +GRANT ALL("new_col_5_$%{}[]()&*^!@""'`\/#") ON testschema."table_3_$%{}[]()&*^!@""'`\/#" TO PUBLIC; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/test.json index 1d515ca4c..bd0f217ec 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/12_plus/test.json @@ -238,12 +238,23 @@ "name": "new_col_5_$%{}[]()&*^!@\"'`\\/#", "attnum": 5, "attlen":"15", - "attprecision":"0", + "attprecision":"6", "description": "Comment for alter", "attacl":{"added":[{"grantee":"PUBLIC","grantor":"postgres","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false}]}]} }, "expected_sql_file": "alter_column_numeric.sql" }, + { + "type": "alter", + "name": "Alter Column (Remove Length)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "attnum": 3, + "attlen":"" + }, + "expected_sql_file": "alter_column_remove_length.sql" + }, { "type": "delete", "name": "Drop Column (Numeric type with Length Precision & Variables)", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_char.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_char.sql index 5cd145bb3..962634cdc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_char.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_char.sql @@ -3,7 +3,7 @@ -- ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#"; ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" - ADD COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#" character(50) COLLATE pg_catalog."C"; + ADD COLUMN "new_col_2_$%{}[]()&*^!@""'`\/#" character(1) COLLATE pg_catalog."C"; COMMENT ON COLUMN testschema."table_1_$%{}[]()&*^!@""'`\/#"."new_col_2_$%{}[]()&*^!@""'`\/#" IS 'Comment for alter'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_numeric.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_numeric.sql index 5e5eb3e18..f115459d4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_numeric.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_numeric.sql @@ -3,7 +3,7 @@ -- ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_3_$%{}[]()&*^!@""'`\/#"; ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" - ADD COLUMN "new_col_3_$%{}[]()&*^!@""'`\/#" numeric(15,0) NOT NULL; + ADD COLUMN "new_col_3_$%{}[]()&*^!@""'`\/#" numeric(15,6) NOT NULL; COMMENT ON COLUMN testschema."table_1_$%{}[]()&*^!@""'`\/#"."new_col_3_$%{}[]()&*^!@""'`\/#" IS 'Comment for alter'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_remove_length.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_remove_length.sql new file mode 100644 index 000000000..7a7445b66 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/alter_column_remove_length.sql @@ -0,0 +1,15 @@ +-- Column: testschema."table_1_$%{}[]()&*^!@""'`\/#"."new_col_3_$%{}[]()&*^!@""'`\/#" + +-- ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" DROP COLUMN "new_col_3_$%{}[]()&*^!@""'`\/#"; + +ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" + ADD COLUMN "new_col_3_$%{}[]()&*^!@""'`\/#" numeric NOT NULL; + +COMMENT ON COLUMN testschema."table_1_$%{}[]()&*^!@""'`\/#"."new_col_3_$%{}[]()&*^!@""'`\/#" + IS 'Comment for alter'; + +ALTER TABLE testschema."table_1_$%{}[]()&*^!@""'`\/#" + ALTER COLUMN "new_col_3_$%{}[]()&*^!@""'`\/#" + SET (n_distinct=1); + +GRANT ALL("new_col_3_$%{}[]()&*^!@""'`\/#") ON testschema."table_1_$%{}[]()&*^!@""'`\/#" TO PUBLIC; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/test.json index 8d0e4d05c..8cc45c9fa 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/default/test.json @@ -135,12 +135,23 @@ "name": "new_col_3_$%{}[]()&*^!@\"'`\\/#", "attnum": 3, "attlen":"15", - "attprecision":"0", + "attprecision":"6", "description": "Comment for alter", "attacl":{"added":[{"grantee":"PUBLIC","grantor":"postgres","privileges":[{"privilege_type":"a","privilege":true,"with_grant":false},{"privilege_type":"r","privilege":true,"with_grant":false},{"privilege_type":"w","privilege":true,"with_grant":false},{"privilege_type":"x","privilege":true,"with_grant":false}]}]} }, "expected_sql_file": "alter_column_numeric.sql" }, + { + "type": "alter", + "name": "Alter Column (Remove Length)", + "endpoint": "NODE-column.obj_id", + "sql_endpoint": "NODE-column.sql_id", + "data": { + "attnum": 3, + "attlen":"" + }, + "expected_sql_file": "alter_column_remove_length.sql" + }, { "type": "delete", "name": "Drop Column (Numeric type with Length Precision & Variables)", diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py index bcaab1601..6a6dd1ac9 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/tests/test_column_msql.py @@ -53,7 +53,7 @@ class ColumnMsqlTestCase(BaseTestGenerator): old_len=5, new_precision=4, expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN ' - '{column} TYPE numeric ({len}, {precision})[];' + '{column} TYPE numeric({len}, {precision})[];' )), ('msql column change numeric precision', dict( @@ -62,7 +62,7 @@ class ColumnMsqlTestCase(BaseTestGenerator): old_len=6, new_precision=5, expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN ' - '{column} TYPE numeric ({len}, {precision});' + '{column} TYPE numeric({len}, {precision});' )), ('msql column change numeric array length', dict( @@ -71,7 +71,7 @@ class ColumnMsqlTestCase(BaseTestGenerator): new_len=8, old_precision=3, expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN ' - '{column} TYPE numeric ({len}, {precision})[];' + '{column} TYPE numeric({len}, {precision})[];' )), ('msql column change numeric length', dict( @@ -80,7 +80,7 @@ class ColumnMsqlTestCase(BaseTestGenerator): new_len=8, old_precision=4, expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN ' - '{column} TYPE numeric ({len}, {precision});' + '{column} TYPE numeric({len}, {precision});' )), ('msql column change numeric array len and precision', dict( @@ -89,7 +89,7 @@ class ColumnMsqlTestCase(BaseTestGenerator): new_len=15, new_precision=8, expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN ' - '{column} TYPE numeric ({len}, {precision})[];' + '{column} TYPE numeric({len}, {precision})[];' )), ('msql column change numeric len and precision', dict( @@ -98,7 +98,7 @@ class ColumnMsqlTestCase(BaseTestGenerator): new_len=14, new_precision=9, expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN ' - '{column} TYPE numeric ({len}, {precision});' + '{column} TYPE numeric({len}, {precision});' )) ] 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 new file mode 100644 index 000000000..bad938142 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py @@ -0,0 +1,360 @@ +########################################################################## +# +# pgAdmin 4 - PostgreSQL Tools +# +# Copyright (C) 2013 - 2019, The pgAdmin Development Team +# This software is released under the PostgreSQL Licence +# +########################################################################## + +""" Implements Utility class for Compound Triggers. """ + +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 +from pgadmin.browser.server_groups.servers.databases.schemas.utils \ + import DataTypeReader +from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \ + parse_priv_to_db +from functools import wraps + + +def get_template_path(f): + """ + This function will behave as a decorator which will prepare + the template path based on database server version. + """ + + @wraps(f) + def wrap(*args, **kwargs): + # Here args[0] will hold the connection object + conn_obj = args[0] + if 'template_path' not in kwargs: + kwargs['template_path'] = 'columns/sql/#{0}#'.format( + conn_obj.manager.version) + + return f(*args, **kwargs) + return wrap + + +@get_template_path +def get_parent(conn, tid, template_path=None): + """ + This function will return the parent of the given table. + :param conn: Connection Object + :param tid: Table oid + :param template_path: Optional template path + :return: + """ + + SQL = render_template("/".join([template_path, + 'get_parent.sql']), tid=tid) + status, rset = conn.execute_2darray(SQL) + if not status: + raise Exception(rset) + + schema = '' + table = '' + if 'rows' in rset and len(rset['rows']) > 0: + schema = rset['rows'][0]['schema'] + table = rset['rows'][0]['table'] + + return schema, table + + +@get_template_path +def column_formatter(conn, tid, clid, data, template_path=None): + """ + This function will return formatted output of query result + as per client model format for column node + :param conn: Connection Object + :param tid: Table ID + :param clid: Column ID + :param data: Data + :param template_path: Optional template path + :return: + """ + + # To check if column is primary key + if 'attnum' in data and 'indkey' in data: + # Current column + attnum = str(data['attnum']) + + # Single/List of primary key column(s) + indkey = str(data['indkey']) + + # We will check if column is in primary column(s) + if attnum in indkey.split(" "): + data['is_pk'] = True + data['is_primary_key'] = True + else: + data['is_pk'] = False + data['is_primary_key'] = False + + # Fetch length and precision + data = fetch_length_precision(data) + + # We need to fetch inherited tables for each table + SQL = render_template("/".join([template_path, + 'get_inherited_tables.sql']), tid=tid) + status, inh_res = conn.execute_dict(SQL) + if not status: + return internal_server_error(errormsg=inh_res) + for row in inh_res['rows']: + if row['attrname'] == data['name']: + data['is_inherited'] = True + data['tbls_inherited'] = row['inhrelname'] + + # We need to format variables according to client js collection + if 'attoptions' in data and data['attoptions'] is not None: + spcoptions = [] + for spcoption in data['attoptions']: + k, v = spcoption.split('=') + spcoptions.append({'name': k, 'value': v}) + + data['attoptions'] = spcoptions + + # Need to format security labels according to client js collection + if 'seclabels' in data and data['seclabels'] is not None: + seclabels = [] + for seclbls in data['seclabels']: + k, v = seclbls.split('=') + seclabels.append({'provider': k, 'label': v}) + + data['seclabels'] = seclabels + + # We need to parse & convert ACL coming from database to json format + SQL = render_template("/".join([template_path, 'acl.sql']), + tid=tid, clid=clid) + status, acl = conn.execute_dict(SQL) + + if not status: + return internal_server_error(errormsg=acl) + + # We will set get privileges from acl sql so we don't need + # it from properties sql + data['attacl'] = [] + + for row in acl['rows']: + priv = parse_priv_from_db(row) + data.setdefault(row['deftype'], []).append(priv) + + # we are receiving request when in edit mode + # we will send filtered types related to current type + type_id = data['atttypid'] + + SQL = render_template("/".join([template_path, 'is_referenced.sql']), + tid=tid, clid=clid) + + status, is_reference = conn.execute_scalar(SQL) + + edit_types_list = list() + # We will need present type in edit mode + edit_types_list.append(data['cltype']) + + if int(is_reference) == 0: + SQL = render_template("/".join([template_path, + 'edit_mode_types.sql']), + type_id=type_id) + status, rset = conn.execute_2darray(SQL) + + for row in rset['rows']: + edit_types_list.append(row['typname']) + + data['edit_types'] = edit_types_list + + data['cltype'] = DataTypeReader.parse_type_name(data['cltype']) + + return data + + +@get_template_path +def get_formatted_columns(conn, tid, data, other_columns, + table_or_type, template_path=None): + """ + This function will iterate and return formatted data for all + the columns. + :param conn: Connection Object + :param tid: Table ID + :param data: Data + :param other_columns: + :param table_or_type: + :param template_path: Optional template path + :return: + """ + SQL = render_template("/".join([template_path, 'properties.sql']), + tid=tid, show_sys_objects=False) + + status, res = conn.execute_dict(SQL) + if not status: + raise Exception(res) + + all_columns = res['rows'] + + # Add inherited from details from other columns - type, table + for col in all_columns: + for other_col in other_columns: + if col['name'] == other_col['name']: + col['inheritedfrom' + table_or_type] = \ + other_col['inheritedfrom'] + + data['columns'] = all_columns + + if 'columns' in data and len(data['columns']) > 0: + for column in data['columns']: + column_formatter(conn, tid, column['attnum'], column) + + return data + + +def parse_format_columns(data, mode=None): + """ + This function will parse and return formatted list of columns + added by user. + + :param data: + :param mode: + :return: + """ + column_acl = ['a', 'r', 'w', 'x'] + columns = data['columns'] + # 'EDIT' mode + if mode is not None: + for action in ['added', 'changed']: + if action in columns: + final_columns = [] + for c in columns[action]: + if 'inheritedfrom' not in c: + final_columns.append(c) + + for c in final_columns: + if 'attacl' in c: + if 'added' in c['attacl']: + c['attacl']['added'] = parse_priv_to_db( + c['attacl']['added'], column_acl + ) + elif 'changed' in c['attacl']: + c['attacl']['changed'] = parse_priv_to_db( + c['attacl']['changed'], column_acl + ) + elif 'deleted' in c['attacl']: + c['attacl']['deleted'] = parse_priv_to_db( + c['attacl']['deleted'], column_acl + ) + if 'cltype' in c: + # check type for '[]' in it + c['cltype'], c['hasSqrBracket'] = \ + type_formatter(c['cltype']) + + c = convert_length_precision_to_string(c) + + data['columns'][action] = final_columns + else: + # We need to exclude all the columns which are inherited from other + # tables 'CREATE' mode + final_columns = [] + + for c in columns: + if 'inheritedfrom' not in c: + final_columns.append(c) + + # Now we have all lis of columns which we need + # to include in our create definition, Let's format them + for c in final_columns: + if 'attacl' in c: + c['attacl'] = parse_priv_to_db( + c['attacl'], column_acl + ) + + if 'cltype' in c: + # check type for '[]' in it + c['cltype'], c['hasSqrBracket'] = type_formatter(c['cltype']) + + c = convert_length_precision_to_string(c) + + data['columns'] = final_columns + + return data + + +def convert_length_precision_to_string(data): + """ + This function is used to convert length & precision to string + to handle case like when user gives 0 as length. + + :param data: + :return: + """ + + # We need to handle the below case because jquery has changed + # undefined/null values to empty strings + # https://github.com/jquery/jquery/commit/36d2d9ae937f626d98319ed850905e8d1cbfd078 + if 'attlen' in data and data['attlen'] == '': + data['attlen'] = None + elif 'attlen' in data and data['attlen'] is not None: + data['attlen'] = str(data['attlen']) + + if 'attprecision' in data and data['attprecision'] == '': + data['attprecision'] = None + elif 'attprecision' in data and data['attprecision'] is not None: + data['attprecision'] = str(data['attprecision']) + + return data + + +def type_formatter(data_type): + """ + We need to remove [] from type and append it + after length/precision so we will set flag for + sql template. + + :param data_type: + :param template_path: Optional template path + :return: + """ + + if '[]' in data_type: + return data_type[:-2], True + else: + return data_type, False + + +def fetch_length_precision(data): + """ + This function is used to fetch the length and precision. + + :param data: + :return: + """ + # Find length & precision of column data type + fulltype = DataTypeReader.get_full_type( + data['typnspname'], data['typname'], + data['isdup'], data['attndims'], data['atttypmod']) + + length = False + precision = False + if 'elemoid' in data: + length, precision, typeval = \ + DataTypeReader.get_length_precision(data['elemoid']) + + # Set length and precision to None + data['attlen'] = None + data['attprecision'] = None + + import re + + # If we have length & precision both + if length and precision: + matchObj = re.search(r'(\d+),(\d+)', fulltype) + if matchObj: + data['attlen'] = matchObj.group(1) + data['attprecision'] = matchObj.group(2) + elif length: + # If we have length only + matchObj = re.search(r'(\d+)', fulltype) + if matchObj: + data['attlen'] = matchObj.group(1) + data['attprecision'] = None + + return data diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py index 492983900..70117528f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/utils.py @@ -7,7 +7,7 @@ # ########################################################################## -""" Implements Utility class for Foreign Keys. """ +""" Implements Utility class for Compound Triggers. """ from flask import render_template from flask_babelex import gettext as _ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py index 027a7e31c..47baee9b3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/utils.py @@ -7,7 +7,7 @@ # ########################################################################## -""" Implements Utility class for Exclusion Constraint. """ +""" Implements Utility class for Index Constraint. """ from flask import render_template from flask_babelex import gettext as _ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql index 581369113..61c78e1a0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/10_plus/update.sql @@ -9,7 +9,7 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} {% endif %} {### Alter column type and collation ###} -{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen is not none and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%} +{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%} ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %} COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql index d92d01121..5bf5efd42 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/9.2_plus/update.sql @@ -6,10 +6,9 @@ {% if data.name and data.name != o_data.name %} ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} RENAME {{conn|qtIdent(o_data.name)}} TO {{conn|qtIdent(data.name)}}; - {% endif %} {### Alter column type and collation ###} -{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen is not none and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%} +{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname)%} ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %} COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql index ffbf25035..baabdaa6c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/update.sql @@ -9,7 +9,7 @@ ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} {% endif %} {### Alter column type and collation ###} -{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen is not none and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname) %} +{% if (data.cltype and data.cltype != o_data.cltype) or (data.attlen is defined and data.attlen != o_data.attlen) or (data.attprecision is defined and data.attprecision != o_data.attprecision) or (data.collspcname and data.collspcname != o_data.collspcname) %} ALTER TABLE {{conn|qtIdent(data.schema, data.table)}} ALTER COLUMN {% if data.name %}{{conn|qtTypeIdent(data.name)}}{% else %}{{conn|qtTypeIdent(o_data.name)}}{% endif %} TYPE {{ GET_TYPE.UPDATE_TYPE_SQL(conn, data, o_data) }}{% if data.collspcname and data.collspcname != o_data.collspcname %} COLLATE {{data.collspcname}}{% elif o_data.collspcname %} COLLATE {{o_data.collspcname}}{% endif %}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py index 4535f8b41..7f9336adc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/utils.py @@ -7,7 +7,7 @@ # ########################################################################## -""" Implements Utility class for Foreign Keys. """ +""" Implements Utility class for Triggers. """ from flask import render_template from flask_babelex import gettext as _ 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 1c4cc7bb9..1599d35e2 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 @@ -28,6 +28,8 @@ from pgadmin.utils import IS_PY2 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.\ @@ -57,15 +59,6 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): - It will return formatted output of query result as per client model format - * _columns_formatter(tid, data): - - It will return formatted output of query result - as per client model format for column node - - * _cltype_formatter(type): (staticmethod) - - We need to remove [] from type and append it - after length/precision so we will send flag for - sql template. - * get_table_dependents(self, tid): - This function get the dependents and return ajax response for the table node. @@ -149,129 +142,6 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): return wrap - def _columns_formatter(self, tid, data): - """ - Args: - tid: Table OID - data: dict of query result - - Returns: - It will return formatted output of query result - as per client model format for column node - """ - for column in data['columns']: - - # We need to format variables according to client js collection - if 'attoptions' in column and column['attoptions'] is not None: - spcoptions = [] - for spcoption in column['attoptions']: - k, v = spcoption.split('=') - spcoptions.append({'name': k, 'value': v}) - - column['attoptions'] = spcoptions - - # Need to format security labels according to client js collection - if 'seclabels' in column and column['seclabels'] is not None: - seclabels = [] - for seclbls in column['seclabels']: - k, v = seclbls.split('=') - seclabels.append({'provider': k, 'label': v}) - - column['seclabels'] = seclabels - - if 'attnum' in column and column['attnum'] is not None \ - and column['attnum'] > 0: - # We need to parse & convert ACL coming from database to - # json format - SQL = render_template("/".join( - [self.column_template_path, 'acl.sql']), - tid=tid, clid=column['attnum'] - ) - status, acl = self.conn.execute_dict(SQL) - - if not status: - return internal_server_error(errormsg=acl) - - # We will set get privileges from acl sql so we don't need - # it from properties sql - column['attacl'] = [] - - for row in acl['rows']: - priv = parse_priv_from_db(row) - column.setdefault(row['deftype'], []).append(priv) - - # we are receiving request when in edit mode - # we will send filtered types related to current type - - type_id = column['atttypid'] - - fulltype = self.get_full_type( - column['typnspname'], column['typname'], - column['isdup'], column['attndims'], column['atttypmod'] - ) - - length = False - precision = False - if 'elemoid' in column: - length, precision, typeval = \ - self.get_length_precision(column['elemoid']) - - # Set length and precision to None - column['attlen'] = None - column['attprecision'] = None - - # If we have length & precision both - if length and precision: - matchObj = re.search(r'(\d+),(\d+)', fulltype) - if matchObj: - column['attlen'] = matchObj.group(1) - column['attprecision'] = matchObj.group(2) - elif length: - # If we have length only - matchObj = re.search(r'(\d+)', fulltype) - if matchObj: - column['attlen'] = matchObj.group(1) - column['attprecision'] = None - - SQL = render_template("/".join([self.column_template_path, - 'is_referenced.sql']), - tid=tid, clid=column['attnum']) - - status, is_reference = self.conn.execute_scalar(SQL) - - edit_types_list = list() - # We will need present type in edit mode - edit_types_list.append(column['cltype']) - - if int(is_reference) == 0: - SQL = render_template("/".join([self.column_template_path, - 'edit_mode_types.sql']), - type_id=type_id) - status, rset = self.conn.execute_2darray(SQL) - - for row in rset['rows']: - edit_types_list.append(row['typname']) - - column['edit_types'] = edit_types_list - column['cltype'] = DataTypeReader.parse_type_name( - column['cltype'] - ) - - if 'indkey' in column: - # Current column - attnum = str(column['attnum']) - - # Single/List of primary key column(s) - indkey = str(column['indkey']) - - # We will check if column is in primary column(s) - if attnum in indkey.split(" "): - column['is_primary_key'] = True - else: - column['is_primary_key'] = False - - return data - def _formatter(self, did, scid, tid, data): """ Args: @@ -363,28 +233,9 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): # We will fetch all the columns for the table using # columns properties.sql, so we need to set template path - SQL = render_template("/".join([self.column_template_path, - 'properties.sql']), - tid=tid, - show_sys_objects=False - ) - - status, res = self.conn.execute_dict(SQL) - if not status: - return internal_server_error(errormsg=res) - all_columns = res['rows'] - - # Add inheritedfrom details from other columns - type, table - for col in all_columns: - for other_col in other_columns: - if col['name'] == other_col['name']: - col['inheritedfrom' + table_or_type] = \ - other_col['inheritedfrom'] - - data['columns'] = all_columns - - if 'columns' in data and len(data['columns']) > 0: - data = self._columns_formatter(tid, data) + data = column_utils.get_formatted_columns(self.conn, tid, + data, other_columns, + table_or_type) # Here we will add constraint in our output index_constraints = { @@ -420,23 +271,6 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): return data - @staticmethod - def _cltype_formatter(data_type): - """ - - Args: - data_type: Type string - - Returns: - We need to remove [] from type and append it - after length/precision so we will send flag for - sql template - """ - if '[]' in data_type: - return data_type[:-2], True - else: - return data_type, False - def get_table_dependents(self, tid): """ This function get the dependents and return ajax response @@ -608,7 +442,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): # check type for '[]' in it if 'cltype' in c: c['cltype'], c['hasSqrBracket'] = \ - self._cltype_formatter(c['cltype']) + column_utils.type_formatter(c['cltype']) sql_header = u"-- Table: {0}\n\n-- ".format( self.qtIdent(self.conn, data['schema'], data['name'])) @@ -971,7 +805,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): # Parse/Format columns & create sql if 'columns' in data: # Parse the data coming from client - data = self._parse_format_columns(data, mode='edit') + data = column_utils.parse_format_columns(data, mode='edit') columns = data['columns'] column_sql = '\n' @@ -1010,81 +844,17 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): old_col_data['cltype'], \ old_col_data['hasSqrBracket'] = \ - self._cltype_formatter(old_col_data['cltype']) + column_utils.type_formatter(old_col_data['cltype']) old_col_data = \ - BaseTableView.convert_length_precision_to_string( - old_col_data - ) - - fulltype = self.get_full_type( - old_col_data['typnspname'], - old_col_data['typname'], - old_col_data['isdup'], - old_col_data['attndims'], - old_col_data['atttypmod'] - ) - - def get_type_attr(key, data): - """Utility function""" - if key in data: - return data[key] - return None - - # If the column data type has not changed then fetch - # old length and precision - if 'elemoid' in old_col_data and 'cltype' not in c: - length, precision, typeval = \ - self.get_length_precision( - old_col_data['elemoid']) - - # If we have length & precision both - if length and precision: - matchObj = re.search(r'(\d+),(\d+)', fulltype) - if matchObj: - c['attlen'] = get_type_attr( - 'attlen', c - ) or matchObj.group(1) - c['attprecision'] = get_type_attr( - 'attprecision', c - ) or matchObj.group(2) - elif length: - # If we have length only - matchObj = re.search(r'(\d+)', fulltype) - if matchObj: - c['attlen'] = get_type_attr( - 'attlen', c - ) or matchObj.group(1) - c['attprecision'] = None - else: - c['attlen'] = None - c['attprecision'] = None - - if 'cltype' in c: - typename = c['cltype'] - if 'hasSqrBracket' in c and c['hasSqrBracket']: - typename += '[]' - length, precision, typeval = \ - self.get_length_precision(typename) - - # if new datatype does not have length or precision - # then we cannot apply length or precision of old - # datatype to new one. - - if not length: - old_col_data['attlen'] = -1 - - if not precision: - old_col_data['attprecision'] = None + column_utils.convert_length_precision_to_string( + old_col_data) + old_col_data = column_utils.fetch_length_precision( + old_col_data) old_col_data['cltype'] = \ DataTypeReader.parse_type_name( old_col_data['cltype']) - if int(old_col_data['attlen']) == -1: - old_col_data['attlen'] = None - if 'attprecision' not in old_col_data: - old_col_data['attprecision'] = None - # Sql for alter column if 'inheritedfrom' not in c: column_sql += render_template("/".join( @@ -1098,7 +868,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): c['schema'] = data['schema'] c['table'] = data['name'] - c = BaseTableView.convert_length_precision_to_string(c) + c = column_utils.convert_length_precision_to_string(c) if 'inheritedfrom' not in c: column_sql += render_template("/".join( @@ -1209,7 +979,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): data['relacl'] = parse_priv_to_db(data['relacl'], self.acl) # Parse & format columns - data = self._parse_format_columns(data) + data = column_utils.parse_format_columns(data) data = BaseTableView.check_and_convert_name_to_string(data) if 'foreign_key' in data: @@ -1659,24 +1429,6 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): return schema_name, table_name - @staticmethod - def convert_length_precision_to_string(data): - """ - This function is used to convert length & precision to string - to handle case like when user gives 0 as length - - Args: - data: Data from client - - Returns: - Converted data - """ - if 'attlen' in data and data['attlen'] is not None: - data['attlen'] = str(data['attlen']) - if 'attprecision' in data and data['attprecision'] is not None: - data['attprecision'] = str(data['attprecision']) - return data - def update_vacuum_settings(self, vacuum_key, old_data, data): """ This function iterate the vacuum and vacuum toast table and create diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js index b34d845f8..0ac8ad73a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js @@ -111,7 +111,7 @@ define('pgadmin.node.type', [ // Note: There are ambiguities in the PG catalogs and docs between // precision and scale. In the UI, we try to follow the docs as // closely as possible, therefore we use Length/Precision and Scale - id: 'tlength', label: gettext('Length/precision'), deps: ['type'], type: 'text', + id: 'tlength', label: gettext('Length/Precision'), deps: ['type'], type: 'text', disabled: false, cell: IntegerDepCell, editable: function(m) { // We will store type from selected from combobox @@ -214,13 +214,13 @@ define('pgadmin.node.type', [ this.errorModel.set('type', errmsg); return errmsg; } - // Validation for Length/precision field (see comments above if confused about the naming!) + // Validation for Length/Precision field (see comments above if confused about the naming!) else if (this.get('is_tlength') && !_.isUndefined(this.get('tlength'))) { if (this.get('tlength') < this.get('min_val')) - errmsg = gettext('Length/precision should not be less than %s', this.get('min_val')); + errmsg = gettext('Length/Precision should not be less than %s', this.get('min_val')); if (this.get('tlength') > this.get('max_val') ) - errmsg = gettext('Length/precision should not be greater than %s', this.get('max_val')); + errmsg = gettext('Length/Precision should not be greater than %s', this.get('max_val')); // If we have any error set then throw it to user if(errmsg) { this.errorModel.set('tlength', errmsg); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/macros/get_full_type_sql_format.macros b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/macros/get_full_type_sql_format.macros index 66e4e2fbe..f77460080 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/macros/get_full_type_sql_format.macros +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/templates/types/macros/get_full_type_sql_format.macros @@ -22,6 +22,21 @@ time({{ type_length }}) with time zone{% endif %}{% if is_type_array %} {##### BELOW MACRO IS USED FOR COLUMN TYPE UPDATE #####} {######################################################} {% macro UPDATE_TYPE_SQL(conn, data, o_data) %} +{% if data.attprecision is defined and data.attprecision is none %} +{% set old_precision = none %} +{% elif data.attprecision is defined and data.attprecision is not none %} +{% set data_precision = data.attprecision %} +{% set old_precision = o_data.attprecision %} +{% else %} +{% set old_precision = o_data.attprecision %} +{% endif %} +{% if data.attlen is defined and data.attlen is none %} +{% set old_length = none %} +{% set old_precision = none %} +{% set data_precision = none %} +{% else %} +{% set old_length = o_data.attlen %} +{% endif %} {% if data.cltype and data.cltype.startswith('time') and data.attlen %} {#############################################################} {###### Need to check against separate time types - START ######} @@ -34,12 +49,12 @@ time({{ data.attlen }}) with time zone {% endif %}{% if data.hasSqrBracket %}[]{ {#############################################################} {# if only type changes, we need to give previous length to current type#} {#############################################################} -{% elif data.cltype and data.cltype.startswith('time') and o_data.attlen != 'None' %} +{% elif data.cltype and data.cltype.startswith('time') %} {% if data.cltype == "timestamp without time zone" %} -timestamp({{ o_data.attlen }}) without time zone {% elif data.cltype == "timestamp with time zone" %} -timestamp({{ o_data.attlen }}) with time zone {% elif data.cltype == "time without time zone" %} -time({{ o_data.attlen }}) without time zone {% elif data.cltype == "time with time zone" %} -time({{ o_data.attlen }}) with time zone {% endif %}{% if data.hasSqrBracket %}[]{% endif %} +timestamp{% if o_data.attlen is not none %}({{ o_data.attlen }}){% endif %} without time zone {% elif data.cltype == "timestamp with time zone" %} +timestamp{% if o_data.attlen is not none %}({{ o_data.attlen }}){% endif %} with time zone {% elif data.cltype == "time without time zone" %} +time{% if o_data.attlen is not none %}({{ o_data.attlen }}){% endif %} without time zone {% elif data.cltype == "time with time zone" %} +time{% if o_data.attlen is not none %}({{ o_data.attlen }}){% endif %} with time zone {% endif %}{% if data.hasSqrBracket %}[]{% endif %} {#############################################################} {# if only length changes, we need to give previous length to current type#} {#############################################################} @@ -54,10 +69,10 @@ time({{ data.attlen }}) with time zone {% endif %}{% if o_data.hasSqrBracket %}[ {#############################################################} {########## We will create SQL for other types here ##########} {#############################################################} -{% if data.cltype %}{{ data.cltype }} {% elif o_data.typnspname != 'pg_catalog' %}{{conn|qtTypeIdent(o_data.typnspname, o_data.cltype)}}{% else %}{{conn|qtTypeIdent(o_data.cltype)}} {% endif %}{% if (data.attlen and data.attlen != 'None') or (data.attprecision and data.attprecision != 'None') or (o_data.attlen and o_data.attlen != 'None' and o_data.attlen|int >0) or (o_data.attprecision and o_data.attprecision != 'None') %} -{% if data.attlen and data.attlen != 'None' %} -({{ data.attlen }}{% elif o_data.attlen and o_data.attlen != 'None' %}({{ o_data.attlen }}{% endif %}{% if data.attprecision and data.attprecision != 'None' %} -, {{ data.attprecision }}){% elif o_data.attprecision and o_data.attprecision != 'None' %}, {{ o_data.attprecision }}){% else %}){% endif %} +{% if data.cltype %}{{ data.cltype }}{% elif o_data.typnspname != 'pg_catalog' %}{{conn|qtTypeIdent(o_data.typnspname, o_data.cltype)}}{% else %}{{conn|qtTypeIdent(o_data.cltype)}}{% endif %}{% if (data.attlen and data.attlen is not none) or (data_precision and data_precision is not none) or (old_length and old_length is not none and old_length|int >0) or (old_precision and old_precision is not none) %} +{% if data.attlen and data.attlen is not none %} +({{ data.attlen }}{% elif old_length and old_length is not none %}({{ old_length }}{% endif %}{% if data_precision and data_precision is not none %} +, {{ data_precision }}){% elif old_precision and old_precision is not none %}, {{ old_precision }}){% else %}){% endif %} {% endif %}{% if o_data.hasSqrBracket %}[]{% endif %} {% endif %} {% endmacro %} 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 05cc8f142..13da66e35 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py @@ -144,7 +144,12 @@ class DataTypeReader: # Max of integer value max_val = 2147483647 else: - max_val = 10 + # Max value is 6 for data type like + # interval, timestamptz, etc.. + if typeval == 'D': + max_val = 6 + else: + max_val = 10 res.append({ 'label': row['typname'], 'value': row['typname'], @@ -206,7 +211,8 @@ class DataTypeReader: return length, precision, typeval - def get_full_type(self, nsp, typname, isDup, numdims, typmod): + @staticmethod + def get_full_type(nsp, typname, isDup, numdims, typmod): """ Returns full type name with Length and Precision. @@ -273,6 +279,10 @@ class DataTypeReader: elif name == 'interval': _prec = 0 _len = typmod & 0xffff + # Max length for interval data type is 6 + # If length is greater then 6 then set length to None + if _len > 6: + _len = '' length += str(_len) elif name == 'date': # Clear length @@ -330,6 +340,10 @@ class DataTypeReader: from re import sub as sub_str pattern = r'(\(\d+\))' type_name = sub_str(pattern, '', type_name) + # We need special handling for interval types like + # interval hours to minute. + elif type_name.startswith("interval"): + type_name = 'interval' if is_array: type_name += "[]"