public inbox for [email protected]
help / color / mirror / Atom feed[pgAdmin][RM4938] Code refactoring of 'Columns' node
2+ messages / 2 participants
[nested] [flat]
* [pgAdmin][RM4938] Code refactoring of 'Columns' node
@ 2019-11-27 08:55 Akshay Joshi <[email protected]>
0 siblings, 1 reply; 2+ messages in thread
From: Akshay Joshi @ 2019-11-27 08:55 UTC (permalink / raw)
To: pgadmin-hackers
Hi Hackers,
Attached is the patch contains following fixes:
- RM #4938 Code refactoring of 'Columns' node.
- RM #4761 Wrong type when changing timestamp with time zone to
timestamp without a time zone.
- RM #4964 Column length is not being removed through the properties of
any table.
- RM #4965 Interval data type is not displayed in the properties section
of a table>columns.
- Change the label from 'Length and Precision' to 'Length/Precision and
Scale' for columns.
- The maximum length for datatype like interval, timestamp with time
zone, time with time zone, etc.. is 6. Set the max length to 6 instead of
10.
Please review and test it from the table and column dialogs.
--
*Thanks & Regards*
*Akshay Joshi*
*Sr. Software Architect*
*EnterpriseDB Software India Private Limited*
*Mobile: +91 976-788-8246*
Attachments:
[application/octet-stream] RM_4938.patch (311.1K, 3-RM_4938.patch)
download | inline diff:
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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
literal 44189
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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/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..756ac29ff 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
@@ -348,7 +348,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'),
@@ -404,7 +404,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'),
@@ -723,9 +723,9 @@ define('pgadmin.node.column', [
&& 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');
+ msg = gettext('Length/Precision 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');
+ msg = gettext('Length/Precision should not be greater than: ') + this.get('max_val');
// If we have any error set then throw it to user
if(msg) {
this.errorModel.set('attlen', msg);
@@ -736,12 +736,13 @@ define('pgadmin.node.column', [
if (!_.isUndefined(this.get('cltype'))
&& !_.isUndefined(this.get('attprecision'))
&& !_.isNull(this.get('attprecision'))
- && this.get('attprecision') !== '') {
+ && this.get('attprecision') !== ''
+ && this.get('attprecision') !== '0') {
// Validation for precision field
if (this.get('attprecision') < this.get('min_val'))
- msg = gettext('Precision should not be less than: ') + this.get('min_val');
+ msg = gettext('Scale 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');
+ msg = gettext('Scale should not be greater than: ') + this.get('max_val');
// 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 += "[]"
^ permalink raw reply [nested|flat] 2+ messages in thread
* Re: [pgAdmin][RM4938] Code refactoring of 'Columns' node
@ 2019-11-28 12:16 Aditya Toshniwal <[email protected]>
parent: Akshay Joshi <[email protected]>
0 siblings, 0 replies; 2+ messages in thread
From: Aditya Toshniwal @ 2019-11-28 12:16 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay,
The patch looks good to me. Test cases are passing.
I had found one issue, but it was not related to your patch so I've logged
it in redmine.
Apart from that, I've changed column.js code slightly to handle min_val and
max_val for length and precision correctly.
Attached is the updated patch.
On Wed, Nov 27, 2019 at 2:25 PM Akshay Joshi <[email protected]>
wrote:
> Hi Hackers,
>
> Attached is the patch contains following fixes:
>
> - RM #4938 Code refactoring of 'Columns' node.
> - RM #4761 Wrong type when changing timestamp with time zone to
> timestamp without a time zone.
> - RM #4964 Column length is not being removed through the properties
> of any table.
> - RM #4965 Interval data type is not displayed in the properties
> section of a table>columns.
> - Change the label from 'Length and Precision' to 'Length/Precision
> and Scale' for columns.
> - The maximum length for datatype like interval, timestamp with time
> zone, time with time zone, etc.. is 6. Set the max length to 6 instead of
> 10.
>
> Please review and test it from the table and column dialogs.
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
>
> *Sr. Software Architect*
> *EnterpriseDB Software India Private Limited*
> *Mobile: +91 976-788-8246*
>
--
Thanks and Regards,
Aditya Toshniwal
Sr. Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
Attachments:
[application/octet-stream] RM_4938_v2.patch (84.1K, 3-RM_4938_v2.patch)
download | inline diff:
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 e72ac61be..dc6c03106 100644
Binary files a/docs/en_US/images/column_definition.png and b/docs/en_US/images/column_definition.png differ
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 c760bef65..fc47b0b02
Binary files a/docs/en_US/images/table_columns.png and b/docs/en_US/images/table_columns.png differ
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 += "[]"
^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2019-11-28 12:16 UTC | newest]
Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2019-11-27 08:55 [pgAdmin][RM4938] Code refactoring of 'Columns' node Akshay Joshi <[email protected]>
2019-11-28 12:16 ` Aditya Toshniwal <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox