public inbox for [email protected]
help / color / mirror / Atom feedFrom: Akshay Joshi <[email protected]>
To: Dave Page <[email protected]>
Cc: Joao Pedro De Almeida Pereira <[email protected]>
Cc: pgadmin-hackers <[email protected]>
Subject: Re: [pgadmin][patch] [GreenPlum] When user press Explain Plan and Explain analyze plan an error is displayed
Date: Tue, 20 Mar 2018 18:42:06 +0530
Message-ID: <CANxoLDeQZt-QxFkm3DO=9KaArySnfpysF8cZpojyWVd7ntTaxA@mail.gmail.com> (raw)
In-Reply-To: <CA+OCxoz9Bj8=q6440-sK=x_10kCquT1fNfpFimysrBRZwgq_Bw@mail.gmail.com>
References: <CAE+jjakOhMJBMqsUaQuL9w4an0V4Q4nvY51K3GqWzm8jbj9cog@mail.gmail.com>
<CA+OCxowBzhOaJf1_w1gPhOR4TH3bdtKBsdqETAqSwK0n2GWezg@mail.gmail.com>
<CA+OCxoyT9yQU-ayjRa94UMaekGP7QhB3CNqaJ_A-j8t+4Jb4FA@mail.gmail.com>
<CAE+jjam6bc4HeZgFbRayxXOJVft6J7s=Xb7M8i54mX7tNCp08Q@mail.gmail.com>
<CA+OCxozK4FeKyugzWNc2aRC1cMONiQMbFgus7Aj=7U28CaKV=Q@mail.gmail.com>
<CANxoLDecQruspbc0dyw6ARNAM6DYJF5pC_0UJPqUzAM9spQHYg@mail.gmail.com>
<CA+OCxowWOpZ9r+S2SvNgqncN6aFGpc4Rom7-S74LVEmP92Tdag@mail.gmail.com>
<CANxoLDex35O8HVcNNT7-Tx+ug1fG8fYRn89Z0n6akYF25J2Z5g@mail.gmail.com>
<CA+OCxoz9Bj8=q6440-sK=x_10kCquT1fNfpFimysrBRZwgq_Bw@mail.gmail.com>
Hi Hackers
Attached is the patch file to fix the RM #2815.
On Tue, Mar 20, 2018 at 3:24 PM, Dave Page <[email protected]>
wrote:
>
>
> On Tue, Mar 20, 2018 at 9:48 AM, Akshay Joshi <
> [email protected]> wrote:
>
>>
>>
>> On Tue, Mar 20, 2018 at 3:06 PM, Dave Page <[email protected]>
>> wrote:
>>
>>> I'm a little concerned that noone mentioned this earlier; I'm supposed
>>> to be building the release this afternoon, and I expect this change to at
>>> the very least be complex to fully test and verify. What's the ETA on the
>>> patch? What steps are being taken to ensure it's correct and doesn't cause
>>> regressions?
>>>
>>
>> Harshal has already mentioned in the RM. Currently I am changing the
>> logic, but it may take time to complete, fully test and verify. I'll try my
>> best to do it asap.
>>
>
> Sure, but how many of us are watching every comment on every RM? I know
> I'm not (I currently average ~400 emails/day).
>
>
>>
>>> On Tue, Mar 20, 2018 at 7:51 AM, Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Hi Joao
>>>>
>>>> It seems that this fix broke the functionality of RM #2815. It is
>>>> mentioned in the RM what needs to be fixed now and I am currently working
>>>> on it.
>>>> While fixing the issue following problem that I found
>>>>
>>>> - In "start_running_query.py" file, we need to remove check "if conn.connected()"
>>>> from "__execute_query" function as we required exception to be thrown while
>>>> executing the query to identify the ConnectionLost.
>>>> - In "execute_query.js" we have used *axios* to execute the query
>>>> and in case of exception, object is different then normal javascript
>>>> response object.
>>>> - We call following functions when exception or error comes and
>>>> send the "*<object>.response.data*" as parameter
>>>> - wasConnectionLostToServer(): Check for the readyState
>>>> parameter, which is not the part of "<object>.response.data".
>>>> - extractErrorMessage(): Check for the "responseJSON" and "
>>>> responseJSON.info", which is not the part of
>>>> "<object>.response.data".
>>>> - is_pga_login_required(): Check for the "responseJSON" and "
>>>> responseJSON.info", which is not the part of
>>>> "<object>.response.data".
>>>> - is_new_transaction_required(): Check for the "responseJSON"
>>>> and "responseJSON.info", which is not the part of
>>>> "<object>.response.data".
>>>>
>>>> From the above list, some of the function calls are generic where they
>>>> need "responseJSON" and "responseJSON.info", so we can't change that.
>>>> Possible solution could be pass one extra flag as parameter to identify the
>>>> object is a axios response or javascript response to above functions
>>>> and change the logic accordingly.
>>>>
>>>> Please let me know your thoughts or any other suggestion.
>>>>
>>>>
>>>> On Fri, Feb 9, 2018 at 8:17 PM, Dave Page <[email protected]> wrote:
>>>>
>>>>> Thanks, applied.
>>>>>
>>>>> On Fri, Feb 9, 2018 at 2:35 PM, Joao De Almeida Pereira <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hello,
>>>>>> Attached you can find the fix for the current pronlem
>>>>>>
>>>>>>
>>>>>> On Fri, Feb 9, 2018 at 7:29 AM Dave Page <[email protected]> wrote:
>>>>>>
>>>>>>> Hi Joao,
>>>>>>>
>>>>>>> It looks like Jenkins has taken umbrage to this change, at least
>>>>>>> with Python 3.x. Can you take a look please?
>>>>>>>
>>>>>>> https://jenkins.pgadmin.org/
>>>>>>>
>>>>>>> Thanks.
>>>>>>>
>>>>>>> On Fri, Feb 9, 2018 at 11:54 AM, Dave Page <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Thanks, patches applied.
>>>>>>>>
>>>>>>>> On Fri, Feb 2, 2018 at 10:50 PM, Joao De Almeida Pereira <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> Hi Hackers,
>>>>>>>>> This is quite a big patch in order to solve the problem with the
>>>>>>>>> Explain Plan.
>>>>>>>>>
>>>>>>>>> We sent 2 patches that have the following:
>>>>>>>>> *- update-javascript-packages.diff *
>>>>>>>>> Add package:
>>>>>>>>> is-docker to select a specific setting when running the
>>>>>>>>> Chrome tests in
>>>>>>>>> Docker
>>>>>>>>>
>>>>>>>>> Upgrade the version of:
>>>>>>>>> - babel-loader
>>>>>>>>> - extract-text-webpack-plugin
>>>>>>>>> - jasmine-core
>>>>>>>>> - jasmine-enzyme
>>>>>>>>> - moment
>>>>>>>>> *- explain-plan-greenplum.diff*
>>>>>>>>> Extract SQLEditor.execute and SQLEditor._poll into their own
>>>>>>>>> files and add test around them
>>>>>>>>> Extract SQLEditor backend functions that start executing query
>>>>>>>>> to their own files and add tests around it
>>>>>>>>> Move the Explain SQL from the front-end and now pass the Explain
>>>>>>>>> plan parameters as a JSON object in the start query call.
>>>>>>>>> Extract the compile_template_name into a function that can be
>>>>>>>>> used by the different places that try to select the version of the template
>>>>>>>>> and the server type
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> Joao
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Dave Page
>>>>>>>> Blog: http://pgsnake.blogspot.com
>>>>>>>> Twitter: @pgsnake
>>>>>>>>
>>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>>>>>> The Enterprise PostgreSQL Company
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Dave Page
>>>>>>> Blog: http://pgsnake.blogspot.com
>>>>>>> Twitter: @pgsnake
>>>>>>>
>>>>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>>>>> The Enterprise PostgreSQL Company
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Dave Page
>>>>> Blog: http://pgsnake.blogspot.com
>>>>> Twitter: @pgsnake
>>>>>
>>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>>> The Enterprise PostgreSQL Company
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect *
>>>>
>>>>
>>>>
>>>> *Phone: +91 20-3058-9517 <+91%2020%203058%209517>Mobile: +91
>>>> 976-788-8246 <+91%2097678%2088246>*
>>>>
>>>
>>>
>>>
>>> --
>>> Dave Page
>>> VP, Chief Architect, Tools & Installers
>>> EnterpriseDB: http://www.enterprisedb.com
>>> The Enterprise PostgreSQL Company
>>>
>>> Blog: http://pgsnake.blogspot.com
>>> Twitter: @pgsnake
>>>
>>
>>
>>
>> --
>> *Akshay Joshi*
>>
>> *Sr. Software Architect *
>>
>>
>>
>> *Phone: +91 20-3058-9517 <+91%2020%203058%209517>Mobile: +91 976-788-8246
>> <+91%2097678%2088246>*
>>
>
>
>
> --
> Dave Page
> VP, Chief Architect, Tools & Installers
> EnterpriseDB: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
--
*Akshay Joshi*
*Sr. Software Architect *
*Phone: +91 20-3058-9517Mobile: +91 976-788-8246*
Attachments:
[application/octet-stream] RM_2815.patch (21.7K, 3-RM_2815.patch)
download | inline diff:
diff --git a/web/pgadmin/dashboard/static/js/dashboard.js b/web/pgadmin/dashboard/static/js/dashboard.js
index dd6ecf9..4d817ad 100644
--- a/web/pgadmin/dashboard/static/js/dashboard.js
+++ b/web/pgadmin/dashboard/static/js/dashboard.js
@@ -444,18 +444,28 @@ define('pgadmin.dashboard', [
pgAdmin.Dashboard.render_chart(container, data, dataset, sid, did, url, options, counter, refresh);
},
error: function(xhr) {
- var err = $.parseJSON(xhr.responseText),
- msg = err.errormsg,
+ var err = '',
+ msg = '',
cls;
- // If we get a 428, it means the server isn't connected
- if (xhr.status == 428) {
- if (_.isUndefined(msg) || _.isNull(msg)) {
- msg = gettext('Please connect to the selected server to view the graph.');
- }
+
+ if (xhr.readyState == 0) {
+ msg = gettext('Not connected to the server or the connection to the server has been closed.');
cls = 'info';
- } else {
- msg = gettext('An error occurred whilst rendering the graph.');
- cls = 'danger';
+ } else
+ {
+ err = $.parseJSON(xhr.responseText);
+ msg = err.errormsg;
+
+ // If we get a 428, it means the server isn't connected
+ if (xhr.status == 428) {
+ if (_.isUndefined(msg) || _.isNull(msg)) {
+ msg = gettext('Please connect to the selected server to view the graph.');
+ }
+ cls = 'info';
+ } else {
+ msg = gettext('An error occurred whilst rendering the graph.');
+ cls = 'danger';
+ }
}
$(container).addClass('graph-error');
@@ -576,18 +586,27 @@ define('pgadmin.dashboard', [
filter.search();
},
error: function(model, xhr) {
- var err = $.parseJSON(xhr.responseText),
- msg = err.errormsg,
+ var err = '',
+ msg = '',
cls;
- // If we get a 428, it means the server isn't connected
- if (xhr.status == 428) {
- if (_.isUndefined(msg) || _.isNull(msg)) {
- msg = gettext('Please connect to the selected server to view the table.');
- }
+
+ if (xhr.readyState == 0) {
+ msg = gettext('Not connected to the server or the connection to the server has been closed.');
cls = 'info';
} else {
- msg = gettext('An error occurred whilst rendering the table.');
- cls = 'danger';
+ err = $.parseJSON(xhr.responseText);
+ msg = err.errormsg;
+
+ // If we get a 428, it means the server isn't connected
+ if (xhr.status == 428) {
+ if (_.isUndefined(msg) || _.isNull(msg)) {
+ msg = gettext('Please connect to the selected server to view the table.');
+ }
+ cls = 'info';
+ } else {
+ msg = gettext('An error occurred whilst rendering the table.');
+ cls = 'danger';
+ }
}
// Replace the content with the error, if not already present. Always update the message
diff --git a/web/pgadmin/static/js/sqleditor/execute_query.js b/web/pgadmin/static/js/sqleditor/execute_query.js
index e91c9e8..0feb1e6 100644
--- a/web/pgadmin/static/js/sqleditor/execute_query.js
+++ b/web/pgadmin/static/js/sqleditor/execute_query.js
@@ -52,7 +52,7 @@ class ExecuteQuery {
}, self.sqlServerObject.POLL_FALLBACK_TIME());
}
- execute(sqlStatement, explainPlan) {
+ execute(sqlStatement, explainPlan, connect) {
// If it is an empty query, do nothing.
if (sqlStatement.length <= 0) return;
@@ -64,10 +64,20 @@ class ExecuteQuery {
self.initializeExecutionOnSqlEditor(sqlStatementWithAnalyze);
+ let url = url_for('sqleditor.query_tool_start', {
+ 'trans_id': self.sqlServerObject.transId,
+ });
+
+ /* If connect parameter is true, then send this parameter
+ * as a part of requested url to connect to the server if not
+ * already connected.
+ */
+ if (connect) {
+ url += '?connect=1';
+ }
+
service.post(
- url_for('sqleditor.query_tool_start', {
- 'trans_id': self.sqlServerObject.transId,
- }),
+ url,
JSON.stringify(sqlStatementWithAnalyze),
{headers: {'Content-Type': 'application/json'}})
.then(function (result) {
@@ -90,7 +100,12 @@ class ExecuteQuery {
self.sqlServerObject._highlight_error(httpMessageData.data.result);
}
}).catch(function (error) {
- self.onExecuteHTTPError(error.response.data);
+ // If response is undefined then connection to the server has been lost.
+ if (error.response != undefined && error.response.data != undefined) {
+ self.onExecuteHTTPError(error);
+ } else {
+ self.handleConnectionToServerLost();
+ }
}
);
}
@@ -129,6 +144,12 @@ class ExecuteQuery {
}
).catch(
error => {
+ // If response is undefined then connection to the server has been lost.
+ if (error.response == undefined || error.response.data == undefined) {
+ self.handleConnectionToServerLost();
+ return;
+ }
+
const errorData = error.response.data;
// Enable/Disable query tool button only if is_query_tool is true.
self.sqlServerObject.resetQueryHistoryObject(self.sqlServerObject);
@@ -137,7 +158,7 @@ class ExecuteQuery {
self.enableSQLEditorButtons();
}
- if (ExecuteQuery.wasConnectionLostToServer(errorData)) {
+ if (ExecuteQuery.wasConnectionLostToServer(error.request)) {
self.handleConnectionToServerLost();
return;
}
@@ -179,40 +200,40 @@ class ExecuteQuery {
}
onExecuteHTTPError(httpMessage) {
- this.loadingScreen.hide();
- this.enableSQLEditorButtons();
+ const self = this;
- if (ExecuteQuery.wasConnectionLostToServer(httpMessage)) {
- this.handleConnectionToServerLost();
+ self.loadingScreen.hide();
+ self.enableSQLEditorButtons();
+
+ if (ExecuteQuery.wasConnectionLostToServer(httpMessage.request) ||
+ httpMessage.response == undefined ||
+ httpMessage.response.data == undefined)
+ {
+ self.handleConnectionToServerLost();
return;
}
- if (this.userManagement.is_pga_login_required(httpMessage)) {
- this.sqlServerObject.save_state('execute', [this.explainPlan]);
- this.userManagement.pga_login();
+ if (self.userManagement.is_pga_login_required(httpMessage.response)) {
+ self.sqlServerObject.save_state('execute', [self.explainPlan]);
+ self.userManagement.pga_login();
}
- if (transaction.is_new_transaction_required(httpMessage)) {
- this.sqlServerObject.save_state('execute', [this.explainPlan]);
- this.sqlServerObject.init_transaction();
+ if (transaction.is_new_transaction_required(httpMessage.response)) {
+ self.sqlServerObject.save_state('execute', [self.explainPlan]);
+ self.sqlServerObject.init_transaction();
}
- let msg = httpMessage.errormsg;
- if (httpMessage.responseJSON !== undefined) {
- if (httpMessage.responseJSON.errormsg !== undefined) {
- msg = httpMessage.responseJSON.errormsg;
- }
-
- if (httpMessage.status === 503 && httpMessage.responseJSON.info !== undefined &&
- httpMessage.responseJSON.info === 'CONNECTION_LOST') {
- setTimeout(function () {
- this.sqlServerObject.save_state('execute', [this.explainPlan]);
- this.sqlServerObject.handle_connection_lost(false, httpMessage);
- });
- }
+ let msg = httpMessage.response.data.errormsg;
+ if (httpMessage.response.status === 503 &&
+ httpMessage.response.data.info !== undefined &&
+ httpMessage.response.data.info === 'CONNECTION_LOST') {
+ setTimeout(function () {
+ self.sqlServerObject.save_state('execute', [self.explainPlan]);
+ self.sqlServerObject.handle_connection_lost(false, httpMessage);
+ });
}
- this.sqlServerObject.update_msg_history(false, msg);
+ self.sqlServerObject.update_msg_history(false, msg);
}
removeGridViewMarker() {
diff --git a/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js b/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js
index 9d83c92..8197ba1 100644
--- a/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js
+++ b/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js
@@ -8,6 +8,15 @@
//////////////////////////////////////////////////////////////////////////
export function is_new_transaction_required(xhr) {
+ /* If responseJSON is undefined then it could be object of
+ * axois(Promise HTTP) response, so we should check accordingly.
+ */
+ if (xhr.responseJSON == undefined && xhr.data != undefined) {
+ return xhr.status === 404 && xhr.data &&
+ xhr.data.info &&
+ xhr.data.info === 'DATAGRID_TRANSACTION_REQUIRED';
+ }
+
return xhr.status === 404 && xhr.responseJSON &&
xhr.responseJSON.info &&
xhr.responseJSON.info === 'DATAGRID_TRANSACTION_REQUIRED';
diff --git a/web/pgadmin/tools/sqleditor/__init__.py b/web/pgadmin/tools/sqleditor/__init__.py
index cc0aa4c..ea9a973 100644
--- a/web/pgadmin/tools/sqleditor/__init__.py
+++ b/web/pgadmin/tools/sqleditor/__init__.py
@@ -298,8 +298,11 @@ def start_query_tool(trans_id):
request.data, request.args, request.form
)
+ connect = True if 'connect' in request.args and \
+ request.args['connect'] == '1' else False
+
return StartRunningQuery(blueprint, current_app).execute(
- sql, trans_id, session
+ sql, trans_id, session, connect
)
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index ff5138d..0e07a14 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -1848,7 +1848,17 @@ define('tools.querytool', [
handle_connection_lost: function(create_transaction, xhr) {
var self= this;
- if (xhr.responseJSON.data && !xhr.responseJSON.data.conn_id) {
+
+ /* If responseJSON is undefined then it could be object of
+ * axois(Promise HTTP) response, so we should check accordingly.
+ */
+ if (xhr.responseJSON != undefined &&
+ xhr.responseJSON.data && !xhr.responseJSON.data.conn_id) {
+ // if conn_id is null then this is maintenance db.
+ // so attempt connection connect without prompt.
+ self.init_connection(create_transaction);
+ } else if (xhr.data != undefined &&
+ xhr.data.data && !xhr.data.data.conn_id) {
// if conn_id is null then this is maintenance db.
// so attempt connection connect without prompt.
self.init_connection(create_transaction);
@@ -3747,7 +3757,13 @@ define('tools.querytool', [
sql = self.gridView.query_tool_obj.getValue();
const executeQuery = new ExecuteQuery.ExecuteQuery(this, pgAdmin.Browser.UserManagement);
- executeQuery.execute(sql, explain_prefix);
+
+ if (arguments.length > 0 &&
+ arguments[arguments.length - 1] == 'connect') {
+ executeQuery.execute(sql, explain_prefix, true);
+ } else {
+ executeQuery.execute(sql, explain_prefix);
+ }
},
/* This function is used to highlight the error line and
diff --git a/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py b/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py
index 2a50259..c2ff21c 100644
--- a/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py
+++ b/web/pgadmin/tools/sqleditor/tests/test_start_query_tool.py
@@ -42,6 +42,6 @@ class StartQueryTool(BaseTestGenerator):
self.assertEquals(response.status, '200 OK')
self.assertEquals(response.data, b'some result')
StartRunningQuery_execute_mock \
- .assert_called_with('transformed sql', 1234, ANY)
+ .assert_called_with('transformed sql', 1234, ANY, False)
extract_sql_from_network_parameters_mock \
.assert_called_with(b'"some sql statement"', ANY, ANY)
diff --git a/web/pgadmin/tools/sqleditor/utils/start_running_query.py b/web/pgadmin/tools/sqleditor/utils/start_running_query.py
index 11b946b..3b3c502 100644
--- a/web/pgadmin/tools/sqleditor/utils/start_running_query.py
+++ b/web/pgadmin/tools/sqleditor/utils/start_running_query.py
@@ -36,7 +36,7 @@ class StartRunningQuery:
self.connection_id = str(random.randint(1, 9999999))
self.logger = logger
- def execute(self, sql, trans_id, http_session):
+ def execute(self, sql, trans_id, http_session, connect=False):
session_obj = StartRunningQuery.retrieve_session_information(
http_session,
trans_id
@@ -68,7 +68,7 @@ class StartRunningQuery:
return internal_server_error(errormsg=str(e))
# Connect to the Server if not connected.
- if not conn.connected():
+ if connect and not conn.connected():
status, msg = conn.connect()
if not status:
self.logger.error(msg)
@@ -108,39 +108,34 @@ class StartRunningQuery:
self.connection_id = conn_id
def __execute_query(self, conn, session_obj, sql, trans_id, trans_obj):
- if conn.connected():
- # on successful connection set the connection id to the
- # transaction object
- trans_obj.set_connection_id(self.connection_id)
+ # on successful connection set the connection id to the
+ # transaction object
+ trans_obj.set_connection_id(self.connection_id)
+
+ StartRunningQuery.save_transaction_in_session(session_obj,
+ trans_id, trans_obj)
+
+ # If auto commit is False and transaction status is Idle
+ # then call is_begin_not_required() function to check BEGIN
+ # is required or not.
+
+ if StartRunningQuery.is_begin_required_for_sql_query(trans_obj,
+ conn, sql):
+ conn.execute_void("BEGIN;")
+
+ # Execute sql asynchronously with params is None
+ # and formatted_error is True.
+ try:
+ status, result = conn.execute_async(sql)
+ except ConnectionLost:
+ raise
+
+ # If the transaction aborted for some reason and
+ # Auto RollBack is True then issue a rollback to cleanup.
+ if StartRunningQuery.is_rollback_statement_required(trans_obj,
+ conn):
+ conn.execute_void("ROLLBACK;")
- StartRunningQuery.save_transaction_in_session(session_obj,
- trans_id, trans_obj)
-
- # If auto commit is False and transaction status is Idle
- # then call is_begin_not_required() function to check BEGIN
- # is required or not.
-
- if StartRunningQuery.is_begin_required_for_sql_query(trans_obj,
- conn, sql):
- conn.execute_void("BEGIN;")
-
- # Execute sql asynchronously with params is None
- # and formatted_error is True.
- try:
- status, result = conn.execute_async(sql)
- except ConnectionLost:
- raise
-
- # If the transaction aborted for some reason and
- # Auto RollBack is True then issue a rollback to cleanup.
- if StartRunningQuery.is_rollback_statement_required(trans_obj,
- conn):
- conn.execute_void("ROLLBACK;")
- else:
- status = False
- result = gettext(
- 'Not connected to server or connection with the server has '
- 'been closed.')
return result, status
@staticmethod
diff --git a/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py b/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py
index 23a5c7f..4ad0891 100644
--- a/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py
+++ b/web/pgadmin/tools/sqleditor/utils/tests/test_start_running_query.py
@@ -21,6 +21,7 @@ else:
from unittest.mock import patch, MagicMock
get_driver_exception = Exception('get_driver exception')
+get_connection_lost_exception = Exception('Unable to connect to server')
class StartRunningQueryTest(BaseTestGenerator):
@@ -38,6 +39,7 @@ class StartRunningQueryTest(BaseTestGenerator):
),
pickle_load_return=None,
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=False,
@@ -67,6 +69,7 @@ class StartRunningQueryTest(BaseTestGenerator):
),
pickle_load_return=None,
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=False,
@@ -97,6 +100,7 @@ class StartRunningQueryTest(BaseTestGenerator):
),
pickle_load_return=None,
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=False,
@@ -131,6 +135,7 @@ class StartRunningQueryTest(BaseTestGenerator):
pickle_load_return=MagicMock(conn_id=1,
update_fetched_row_cnt=MagicMock()),
get_driver_exception=True,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=False,
@@ -161,6 +166,7 @@ class StartRunningQueryTest(BaseTestGenerator):
update_fetched_row_cnt=MagicMock()
),
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=ConnectionLost('1', '2', '3'),
is_connected_to_server=False,
@@ -188,6 +194,7 @@ class StartRunningQueryTest(BaseTestGenerator):
update_fetched_row_cnt=MagicMock()
),
get_driver_exception=False,
+ get_connection_lost_exception=True,
manager_connection_exception=None,
is_connected_to_server=False,
@@ -202,7 +209,7 @@ class StartRunningQueryTest(BaseTestGenerator):
expect_internal_server_error_called_with=dict(
errormsg='Unable to connect to server'
),
- expected_logger_error='Unable to connect to server',
+ expected_logger_error=get_connection_lost_exception,
expect_execute_void_called_with='some sql',
)),
('When server is connected and start query async request, '
@@ -223,6 +230,7 @@ class StartRunningQueryTest(BaseTestGenerator):
can_filter=lambda: True
),
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=True,
@@ -265,6 +273,7 @@ class StartRunningQueryTest(BaseTestGenerator):
can_filter=lambda: True
),
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=True,
@@ -307,6 +316,7 @@ class StartRunningQueryTest(BaseTestGenerator):
can_filter=lambda: True
),
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=True,
@@ -349,6 +359,7 @@ class StartRunningQueryTest(BaseTestGenerator):
can_filter=lambda: True
),
get_driver_exception=False,
+ get_connection_lost_exception=False,
manager_connection_exception=None,
is_connected_to_server=True,
@@ -431,6 +442,8 @@ class StartRunningQueryTest(BaseTestGenerator):
manager = self.__create_manager()
if self.get_driver_exception:
get_driver_mock.side_effect = get_driver_exception
+ elif self.get_connection_lost_exception:
+ get_driver_mock.side_effect = get_connection_lost_exception
else:
get_driver_mock.return_value = MagicMock(
connection_manager=lambda session_id: manager)
diff --git a/web/pgadmin/tools/user_management/static/js/user_management.js b/web/pgadmin/tools/user_management/static/js/user_management.js
index 2a3b2f0..3352c15 100644
--- a/web/pgadmin/tools/user_management/static/js/user_management.js
+++ b/web/pgadmin/tools/user_management/static/js/user_management.js
@@ -130,6 +130,15 @@ define([
},
is_pga_login_required(xhr) {
+ /* If responseJSON is undefined then it could be object of
+ * axois(Promise HTTP) response, so we should check accordingly.
+ */
+ if (xhr.responseJSON == undefined && xhr.data != undefined) {
+ return xhr.status == 401 && xhr.data &&
+ xhr.data.info &&
+ xhr.data.info == 'PGADMIN_LOGIN_REQUIRED';
+ }
+
return xhr.status == 401 && xhr.responseJSON &&
xhr.responseJSON.info &&
xhr.responseJSON.info == 'PGADMIN_LOGIN_REQUIRED';
view thread (19+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected]
Subject: Re: [pgadmin][patch] [GreenPlum] When user press Explain Plan and Explain analyze plan an error is displayed
In-Reply-To: <CANxoLDeQZt-QxFkm3DO=9KaArySnfpysF8cZpojyWVd7ntTaxA@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox