diff --git a/docs/en_US/release_notes_4_22.rst b/docs/en_US/release_notes_4_22.rst index 22e43c233..dca1003b1 100644 --- a/docs/en_US/release_notes_4_22.rst +++ b/docs/en_US/release_notes_4_22.rst @@ -47,6 +47,7 @@ Bug fixes | `Issue #5469 `_ - Fixed an issue where select2 hover is inconsistentĀ for the SSL field in create server dialog. | `Issue #5473 `_ - Fixed post-login redirect location when running in server mode under a non-default root. | `Issue #5480 `_ - Fixed an issue where the background job creation failsĀ if there is only a version-specific python binary available in PATH. +| `Issue #5481 `_ - Fixed data truncation issue when updating the data of type character with length. | `Issue #5487 `_ - Fixed an issue where if LDAP_SEARCH_BASE_DN is not set then, the value for LDAP_BASE_DN will be considered. | `Issue #5496 `_ - Fixed an issue where clicking on Select All button, not selecting all the options in pgAgent job scheduler. | `Issue #5503 `_ - Clarify and correct the docs on enabling the pl/debugger plugin on the server. diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/insert.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/insert.sql index b9fedeaa2..a1b35ee8f 100644 --- a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/insert.sql +++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/insert.sql @@ -4,7 +4,7 @@ INSERT INTO {{ conn|qtIdent(nsp_name, object_name) }} ( {% if not loop.first %}, {% endif %}{{ conn|qtIdent(col) }}{% endfor %} ) VALUES ( {% for col in data_to_be_saved %} -{% if not loop.first %}, {% endif %}%({{ pgadmin_alias[col] }})s::{{ data_type[col] }}{% endfor %} +{% if not loop.first %}, {% endif %}%({{ pgadmin_alias[col] }})s{% if type_cast_required[col] %}::{{ data_type[col] }}{% endif %}{% endfor %} ) {% if pk_names and not has_oids %} returning {{pk_names}}{% endif %} {% if has_oids %} returning oid{% endif %}; diff --git a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/update.sql b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/update.sql index 8c011619f..b2559fd81 100644 --- a/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/update.sql +++ b/web/pgadmin/tools/sqleditor/templates/sqleditor/sql/default/update.sql @@ -1,7 +1,7 @@ {# Update the row with primary keys (specified in primary_keys) #} UPDATE {{ conn|qtIdent(nsp_name, object_name) }} SET {% for col in data_to_be_saved %} -{% if not loop.first %}, {% endif %}{{ conn|qtIdent(col) }} = %({{ pgadmin_alias[col] }})s::{{ data_type[col] }}{% endfor %} +{% if not loop.first %}, {% endif %}{{ conn|qtIdent(col) }} = %({{ pgadmin_alias[col] }})s{% if type_cast_required[col] %}::{{ data_type[col] }}{% endif %}{% endfor %} WHERE {% for pk in primary_keys %} {% if not loop.first %} AND {% endif %}{{ conn|qtIdent(pk) }} = {{ primary_keys[pk]|qtLiteral }}{% endfor %}; diff --git a/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py b/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py index c57c0e241..1e927593a 100644 --- a/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py +++ b/web/pgadmin/tools/sqleditor/tests/test_view_data_templates.py @@ -42,7 +42,8 @@ class TestViewDataTemplates(BaseTestGenerator): nsp_name='test_schema', data_type={'text': 'text', 'id': 'integer'}, pk_names='id', - has_oids=False + has_oids=False, + type_cast_required={'text': 'True', 'id': 'True'} ), insert_expected_return_value='INSERT INTO' ' test_schema.test_table' @@ -73,7 +74,8 @@ class TestViewDataTemplates(BaseTestGenerator): nsp_name='test_schema', data_type={'text': 'text', 'id': 'integer'}, pk_names='id, text', - has_oids=False + has_oids=False, + type_cast_required={'text': 'True', 'id': 'True'} ), insert_expected_return_value='INSERT INTO' ' test_schema.test_table' @@ -106,7 +108,8 @@ class TestViewDataTemplates(BaseTestGenerator): nsp_name='test_schema', data_type={'text': 'text', 'id': 'integer'}, pk_names='id', - has_oids=True + has_oids=True, + type_cast_required={'text': 'True', 'id': 'True'} ), insert_expected_return_value='INSERT INTO' ' test_schema.test_table' @@ -137,7 +140,8 @@ class TestViewDataTemplates(BaseTestGenerator): nsp_name='test_schema', data_type={'text': 'text', 'id': 'integer'}, pk_names=None, - has_oids=True + has_oids=True, + type_cast_required={'text': 'True', 'id': 'True'} ), insert_expected_return_value='INSERT INTO' ' test_schema.test_table' diff --git a/web/pgadmin/tools/sqleditor/utils/save_changed_data.py b/web/pgadmin/tools/sqleditor/utils/save_changed_data.py index 109391882..bc30b1395 100644 --- a/web/pgadmin/tools/sqleditor/utils/save_changed_data.py +++ b/web/pgadmin/tools/sqleditor/utils/save_changed_data.py @@ -12,6 +12,8 @@ from collections import OrderedDict from pgadmin.tools.sqleditor.utils.constant_definition import TX_STATUS_IDLE +ignore_type_cast_list = ['character', 'character[]', 'bit', 'bit[]'] + def save_changed_data(changed_data, columns_info, conn, command_obj, client_primary_key, auto_commit=True): @@ -63,6 +65,7 @@ def save_changed_data(changed_data, columns_info, conn, command_obj, column_type = {} column_data = {} + type_cast_required = {} for each_col in columns_info: if ( columns_info[each_col]['not_null'] and @@ -75,6 +78,10 @@ def save_changed_data(changed_data, columns_info, conn, command_obj, column_type[each_col] = \ columns_info[each_col]['type_name'] + type_cast_required[each_col] = \ + True if column_type[each_col] not in ignore_type_cast_list \ + else False + # For newly added rows if of_type == 'added': # Python dict does not honour the inserted item order @@ -123,7 +130,8 @@ def save_changed_data(changed_data, columns_info, conn, command_obj, nsp_name=command_obj.nsp_name, data_type=column_type, pk_names=pk_names, - has_oids=command_obj.has_oids() + has_oids=command_obj.has_oids(), + type_cast_required=type_cast_required ) select_sql = render_template( @@ -161,7 +169,8 @@ def save_changed_data(changed_data, columns_info, conn, command_obj, primary_keys=pk_escaped, object_name=command_obj.object_name, nsp_name=command_obj.nsp_name, - data_type=column_type + data_type=column_type, + type_cast_required=type_cast_required ) list_of_sql[of_type].append({'sql': sql, 'data': data, diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py b/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py index 1e5c5a7a0..8f7cd9dfa 100644 --- a/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py +++ b/web/pgadmin/tools/sqleditor/utils/tests/test_save_changed_data.py @@ -31,7 +31,9 @@ class TestSaveChangedData(BaseTestGenerator): "data": { "pk_col": "3", "__temp_PK": "2", - "normal_col": "three" + "normal_col": "three", + "char_col": "char", + "bit_col": "10101" } } }, @@ -52,8 +54,86 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } + ] + }, + save_status=True, + check_sql='SELECT * FROM %s WHERE pk_col = 3', + check_result=[[3, "three", "char", "10101"]] + )), + ('When inserting row with long value for character varying data type', + dict( + save_payload={ + "updated": {}, + "added": { + "2": { + "err": False, + "data": { + "pk_col": "3", + "__temp_PK": "2", + "normal_col": "invalid-log-string" + } + } + }, + "staged_rows": {}, + "deleted": {}, + "updated_index": {}, + "added_index": {"2": "2"}, + "columns": [{ + "name": "pk_col", + "display_name": "pk_col", + "column_type": "[PK] integer", + "column_type_internal": "integer", + "pos": 0, + "label": "pk_col
[PK] integer", + "cell": "number", + "can_edit": True, + "type": "integer", + "not_null": True, + "has_default_val": False, + "is_array": False + }, { + "name": "normal_col", "display_name": "normal_col", "column_type": "character varying", "column_type_internal": "character varying", @@ -64,14 +144,39 @@ class TestSaveChangedData(BaseTestGenerator): "type": "character varying", "not_null": False, "has_default_val": False, - "is_array": False} - ] - }, - save_status=True, - check_sql='SELECT * FROM %s WHERE pk_col = 3', - check_result=[[3, "three"]] - )), - ('When inserting row with long data', dict( + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + }] + }, + save_status=False, + check_sql='SELECT * FROM %s WHERE pk_col = 3', + check_result='SELECT 0')), + ('When inserting row with long value for character data type', dict( save_payload={ "updated": {}, "added": { @@ -80,7 +185,7 @@ class TestSaveChangedData(BaseTestGenerator): "data": { "pk_col": "3", "__temp_PK": "2", - "normal_col": "invalid-log-string" + "char_col": "invalid long string" } } }, @@ -101,35 +206,63 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", - "display_name": "normal_col", - "column_type": "character varying", - "column_type_internal": "character varying", - "pos": 1, - "label": "normal_col
character varying", - "cell": "string", - "can_edit": True, - "type": "character varying", - "not_null": False, - "has_default_val": False, - "is_array": False} + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } ] }, save_status=False, check_sql='SELECT * FROM %s WHERE pk_col = 3', check_result='SELECT 0' )), - ('When inserting new invalid row', dict( + ('When inserting row with long value for bit data type', dict( save_payload={ "updated": {}, "added": { "2": { "err": False, "data": { - "pk_col": "1", + "pk_col": "3", "__temp_PK": "2", - "normal_col": "four" + "bit_col": "1010101010" } } }, @@ -150,41 +283,70 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", - "display_name": "normal_col", - "column_type": "character varying", - "column_type_internal": "character varying", - "pos": 1, - "label": "normal_col
character varying", - "cell": "string", - "can_edit": True, - "type": "character varying", - "not_null": False, - "has_default_val": False, - "is_array": False} + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } ] }, save_status=False, - check_sql="SELECT * FROM %s " - "WHERE pk_col = 1 AND normal_col = 'four'", + check_sql='SELECT * FROM %s WHERE pk_col = 3', check_result='SELECT 0' )), - ('When updating a row in a valid way', dict( + ('When inserting new invalid row', dict( save_payload={ - "updated": { - "1": - {"err": False, - "data": {"normal_col": "ONE"}, - "primary_keys": - {"pk_col": 1} - } + "updated": {}, + "added": { + "2": { + "err": False, + "data": { + "pk_col": "1", + "__temp_PK": "2", + "normal_col": "four" + } + } }, - "added": {}, "staged_rows": {}, "deleted": {}, - "updated_index": {"1": "1"}, - "added_index": {}, + "updated_index": {}, + "added_index": {"2": "2"}, "columns": [ { "name": "pk_col", @@ -198,31 +360,60 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", - "display_name": "normal_col", - "column_type": "character varying", - "column_type_internal": "character varying", - "pos": 1, - "label": "normal_col
character varying", - "cell": "string", - "can_edit": True, - "type": "character varying", - "not_null": False, - "has_default_val": False, - "is_array": False} + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } ] }, - save_status=True, - check_sql='SELECT * FROM %s WHERE pk_col = 1', - check_result=[[1, "ONE"]] + save_status=False, + check_sql="SELECT * FROM %s " + "WHERE pk_col = 1 AND normal_col = 'four'", + check_result='SELECT 0' )), - ('When updating a row in a invalid way', dict( + ('When updating a row in a valid way', dict( save_payload={ "updated": { "1": {"err": False, - "data": {"normal_col": "INVALID-COL-LENGTH"}, + "data": {"normal_col": "ONE"}, "primary_keys": {"pk_col": 1} } @@ -245,8 +436,82 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } + ] + }, + save_status=True, + check_sql='SELECT * FROM %s WHERE pk_col = 1', + check_result=[[1, "ONE", 'ch1 ', '00000']] + )), + ('When updating a row with long data for character varying data type', + dict( + save_payload={ + "updated": { + "1": {"err": False, + "data": {"normal_col": "INVALID-COL-LENGTH"}, + "primary_keys": {"pk_col": 1} + } + }, + "added": {}, + "staged_rows": {}, + "deleted": {}, + "updated_index": {"1": "1"}, + "added_index": {}, + "columns": [{ + "name": "pk_col", + "display_name": "pk_col", + "column_type": "[PK] integer", + "column_type_internal": "integer", + "pos": 0, + "label": "pk_col
[PK] integer", + "cell": "number", + "can_edit": True, + "type": "integer", + "not_null": True, + "has_default_val": False, + "is_array": False + }, { + "name": "normal_col", "display_name": "normal_col", "column_type": "character varying", "column_type_internal": "character varying", @@ -257,13 +522,191 @@ class TestSaveChangedData(BaseTestGenerator): "type": "character varying", "not_null": False, "has_default_val": False, - "is_array": False} - ] - }, - save_status=False, - check_sql='SELECT * FROM %s WHERE pk_col = 1', - check_result=[[1, "one"]] - )), + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + }] + }, + save_status=False, + check_sql='SELECT * FROM %s WHERE pk_col = 1', + check_result=[[1, "one", 'ch1 ', '00000']] + )), + ('When updating a row with long data for character data type', + dict( + save_payload={ + "updated": { + "1": + {"err": False, + "data": {"char_col": "INVALID-COL-LENGTH"}, + "primary_keys": + {"pk_col": 1} + } + }, + "added": {}, + "staged_rows": {}, + "deleted": {}, + "updated_index": {"1": "1"}, + "added_index": {}, + "columns": [ + { + "name": "pk_col", + "display_name": "pk_col", + "column_type": "[PK] integer", + "column_type_internal": "integer", + "pos": 0, + "label": "pk_col
[PK] integer", + "cell": "number", + "can_edit": True, + "type": "integer", + "not_null": True, + "has_default_val": False, + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } + ] + }, + save_status=False, + check_sql='SELECT * FROM %s WHERE pk_col = 1', + check_result=[[1, "one", 'ch1 ', '00000']] + )), + ('When updating a row with long data for bit data type', + dict( + save_payload={ + "updated": { + "1": + {"err": False, + "data": {"bit_col": "1010110101"}, + "primary_keys": + {"pk_col": 1} + } + }, + "added": {}, + "staged_rows": {}, + "deleted": {}, + "updated_index": {"1": "1"}, + "added_index": {}, + "columns": [ + { + "name": "pk_col", + "display_name": "pk_col", + "column_type": "[PK] integer", + "column_type_internal": "integer", + "pos": 0, + "label": "pk_col
[PK] integer", + "cell": "number", + "can_edit": True, + "type": "integer", + "not_null": True, + "has_default_val": False, + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } + ] + }, + save_status=False, + check_sql='SELECT * FROM %s WHERE pk_col = 1', + check_result=[[1, "one", 'ch1 ', '00000']] + )), ('When updating a row in an invalid way', dict( save_payload={ "updated": { @@ -292,19 +735,47 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", - "display_name": "normal_col", - "column_type": "character varying", - "column_type_internal": "character varying", - "pos": 1, - "label": "normal_col
character varying", - "cell": "string", - "can_edit": True, - "type": "character varying", - "not_null": False, - "has_default_val": False, - "is_array": False} + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } ] }, save_status=False, @@ -333,19 +804,47 @@ class TestSaveChangedData(BaseTestGenerator): "type": "integer", "not_null": True, "has_default_val": False, - "is_array": False}, - {"name": "normal_col", - "display_name": "normal_col", - "column_type": "character varying", - "column_type_internal": "character varying", - "pos": 1, - "label": "normal_col
character varying", - "cell": "string", - "can_edit": True, - "type": "character varying", - "not_null": False, - "has_default_val": False, - "is_array": False} + "is_array": False + }, { + "name": "normal_col", + "display_name": "normal_col", + "column_type": "character varying", + "column_type_internal": "character varying", + "pos": 1, + "label": "normal_col
character varying", + "cell": "string", + "can_edit": True, + "type": "character varying", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "char_col", + "display_name": "normal_col", + "column_type": "character", + "column_type_internal": "character", + "pos": 2, + "label": "char_col
character", + "cell": "string", + "can_edit": True, + "type": "character", + "not_null": False, + "has_default_val": False, + "is_array": False + }, { + "name": "bit_col", + "display_name": "bit_col", + "column_type": "bit", + "column_type_internal": "bit", + "pos": 3, + "label": "bit_col
bit", + "cell": "string", + "can_edit": True, + "type": "bit", + "not_null": False, + "has_default_val": False, + "is_array": False + } ] }, save_status=True, @@ -439,11 +938,13 @@ class TestSaveChangedData(BaseTestGenerator): CREATE TABLE "%s"( pk_col INT PRIMARY KEY, - normal_col VARCHAR(5)); + normal_col character varying(5), + char_col character(4), + bit_col bit(5)); INSERT INTO "%s" VALUES - (1, 'one'), - (2, 'two'); + (1, 'one', 'ch1', '00000'), + (2, 'two', 'ch2', '11111'); """ % (self.test_table_name, self.test_table_name, self.test_table_name)