Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1euKtT-0002pH-Sp for pgadmin-hackers@arkaria.postgresql.org; Fri, 09 Mar 2018 16:29:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1euKtS-0003xL-G1 for pgadmin-hackers@arkaria.postgresql.org; Fri, 09 Mar 2018 16:29:18 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1euKtR-0003xA-V5 for pgadmin-hackers@lists.postgresql.org; Fri, 09 Mar 2018 16:29:18 +0000 Received: from mail-io0-x244.google.com ([2607:f8b0:4001:c06::244]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1euKtN-0007q3-23 for pgadmin-hackers@postgresql.org; Fri, 09 Mar 2018 16:29:15 +0000 Received: by mail-io0-x244.google.com with SMTP id u84so4121382iod.9 for ; Fri, 09 Mar 2018 08:29:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pivotal-io.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ueiAGaeZ8fMHIUQLr2Ec+dDGjTLCuXvRPMDUneW6cbs=; b=dlfzTUY7nCjaAu6rLj6G0bUvawM3EChjY7zmcjs+CkmoTO3rFaHVfqXsg9JjQH1nMV rDl+6VL4ldxVPXu5LDO3Ns+zsw0HoFmHq5iSL/cB76NeJnj7kwdhreRcbWJFb+IFYUWc UHsXvzsaFhr/kjKkx60X2bNih5qcJ0tjD6EycN9thngBC5Toe1TIU71q73qP+qFVaOIc p6TWLsedRCSvJ59gJufzsAfoPHlzLpSfMEIeR2tvhFS6zQjg1jmKwdsCuenvKbDNjLeI PVTRt4IwejfG2VB/UHRZdMYTb7mwEOlj8gsN6Y1lCniKL+eHasLTQlSTwY+VgXyTNSaQ A9Hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ueiAGaeZ8fMHIUQLr2Ec+dDGjTLCuXvRPMDUneW6cbs=; b=h89xF8O93xMt3uvfStkUEy/FgkLptn+mmb94whYVC0TB35q3J7m+tq0u+rwExPcDYS SXyEWO4YGOEIzQ0dAQnz4klo60PFjRZo9+bkLX/uW0QcPSx88Wk1SaoJvMT3jV6pyu4F K3eVae9GgTVb1fTnN6loWIV/yYbRtAfO1CO1aOcQX5j3ksryXDVRFMJlI3g1ByVPvx4k rDlwtb6z139rY6hlpMS16VWGb3sqpwHpWCtteZNbV9e2orV0hMHx+B01p67HZ5ESqZY5 nv6bDxs3OMfoXmgwSEQSGdhg9EKq05LlbRquXYeVZ8MMCUSMf08cg4y7H48gyirGM1ob ge4Q== X-Gm-Message-State: APf1xPAofw8YZJJT4qggxKOn1NgT7f/xfPCcxbb1RgP37DZ0CK/VLCwm fJyMsZ2NRo79Rt+3EVkfyNCNPZZj6Utjdj39YhQVfw== X-Google-Smtp-Source: AG47ELtEpQz+J5z9bXKGjNvZK9T5pt51jFmRfrkFfNCfbCMwubzRm57ILmujd5M5O0TGhz4jLKZkatkhi5PGXtFBFd8= X-Received: by 10.107.38.80 with SMTP id m77mr36914172iom.69.1520612951569; Fri, 09 Mar 2018 08:29:11 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Joao De Almeida Pereira Date: Fri, 09 Mar 2018 16:29:01 +0000 Message-ID: Subject: Re: pgAdmin 4 commit: Support EXPLAIN on Greenplum. Fixes #3097 To: Dave Page Cc: Khushboo Vashi , pgadmin-hackers Content-Type: multipart/alternative; boundary="001a1140c284d1d68c0566fd4a4b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --001a1140c284d1d68c0566fd4a4b Content-Type: text/plain; charset="UTF-8" On Fri, Mar 9, 2018 at 11:04 AM Dave Page wrote: > Hi > > On Fri, Mar 9, 2018 at 3:54 PM, Joao De Almeida Pereira < > jdealmeidapereira@pivotal.io> wrote: > >> Hello, >> Definitely running single tests is something that would be great, >> specially if you are TDDing something waiting 30-40 seconds to get feedback >> is a little cumbersome when the test you are concerned with take less then >> a second. >> >> In the process: >> 1. Write a test >> 2. Make the test pass >> 3. Refactor >> > > Sure, makes sense for development. As I spend 99% of my time reviewing and > testing these days, I was just relaying my pain points :-) > > >> >> in between each step you run the test more then 1 time, and depending on >> the refactoring you might need to run it several times. So imagine waiting >> 30 seconds per run to get results. To run a subset of tests is a pain >> because you need to be always changing the way you run the tests..... >> >> I believe we could archive a better granularity and choosing what test to >> run if we used a runner like pytest or nose to do it. What was the reason >> behind handrolling a test runner script? I am asking this because in a >> previous job I decided to handroll a unittest loader script and that was >> something that I regretted every time I had to touch it, and eventually was >> in the process of changing it to pytest. >> > > Pure newbie-ism. I have no objections to changing to something else, if it > reduces our tech debt. > > >> >> I looked into pytest to replace the current the current runtest, and the >> major problem I found was the testscenarios integration(See Note 1). It can >> be done but we would need to change all the test functions to receive the >> scenario variables through arguments on the function. Also didn't dug much >> into setting all the variables that we need there and all the environment. >> The other issue that I do not like very much about pytest is the fact >> that you loose the unittest assertion that is not so bad because there are >> some neat libraries like: https://github.com/grappa-py/grappa, >> https://github.com/ActivisionGameScience/assertpy, >> https://github.com/dgilland/verify. Personally I really like the syntax >> of Grapa, but the Veridfy one is pretty similar to Jasmine too. >> >> What are your thoughts? >> > > Huh, I also really like the grappa syntax. It's nice and readable. > > >> >> >> >> Note 1: As an example of what our functions would have to look like you >> can see: >> https://github.com/OriMenashe/pytest-scenario/blob/master/tests/test_parametrize.py >> As a example this class: >> > > Without a diff, it's hard to be sure, but it looks like the only change > was BaseTestGenerator to object on the first line? > See the function signature, that is the cumbersome issue > > >> class ServersWithServiceIDAddTestCase(BaseTestGenerator): >> """ This class will add the servers under default server group. """ >> >> scenarios = [ >> # Fetch the default url for server object >> ( >> 'Default Server Node url', dict( >> url='/browser/server/obj/' >> ) >> ) >> ] >> >> def setUp(self): >> pass >> >> def runTest(self): >> """ This function will add the server under default server group.""" >> url = "{0}{1}/".format(self.url, utils.SERVER_GROUP) >> # Add service name in the config >> self.server['service'] = "TestDB" >> response = self.tester.post( >> url, >> data=json.dumps(self.server), >> content_type='html/json' >> ) >> self.assertEquals(response.status_code, 200) >> response_data = json.loads(response.data.decode('utf-8')) >> self.server_id = response_data['node']['_id'] >> >> def tearDown(self): >> """This function delete the server from SQLite """ >> utils.delete_server_with_api(self.tester, self.server_id) >> >> Would have to look changed to: >> >> class ServersWithServiceIDAddTestCase(object): >> """ This class will add the servers under default server group. """ >> >> scenarios = [ >> # Fetch the default url for server object >> ( >> 'Default Server Node url', dict( >> url='/browser/server/obj/' >> ) >> ) >> ] >> >> def setUp(self): >> pass >> >> def runTest(self, url): >> """ This function will add the server under default server group.""" >> url = "{0}{1}/".format(url, utils.SERVER_GROUP) >> # Add service name in the config >> self.server['service'] = "TestDB" >> response = self.tester.post( >> url, >> data=json.dumps(self.server), >> content_type='html/json' >> ) >> self.assertEquals(response.status_code, 200) >> response_data = json.loads(response.data.decode('utf-8')) >> self.server_id = response_data['node']['_id'] >> >> def tearDown(self): >> """This function delete the server from SQLite """ >> utils.delete_server_with_api(self.tester, self.server_id) >> >> >> >> Thanks >> Joao >> >> On Fri, Mar 9, 2018 at 8:31 AM Dave Page wrote: >> >>> On Thu, Mar 8, 2018 at 2:22 PM, Joao De Almeida Pereira < >>> jdealmeidapereira@pivotal.io> wrote: >>> >>>> Hello Khushboo, >>>> Completely forgot about this python "feature"....... >>>> Attached is the fix. >>>> >>> >>> Thanks, applied. >>> >>> >>>> >>>> Just as a side question, does anyone else feel the pain of wanting to >>>> run a single test using a IDE or the command line and not being able to? >>>> >>> >>> Not really - the Python and JS tests are so quick I don't really care >>> (and with the Python ones, I can execute for a single module for even more >>> speed). >>> >>> What I would *really* like, is the ability to run individual feature >>> tests. That would be very valuable and save me a ton of time. >>> >>> >>> >>>> We an HandRolled the loader, and that as some implications. Did anyone >>>> try to use a different launcher like pytest or nose instead of the current >>>> runner? >>>> I understand that testscenarios is one of the problems we have if we >>>> want to move away from this way of running tests. >>>> Any suggestion? >>>> >>>> Thanks >>>> Joao >>>> >>>> On Wed, Mar 7, 2018 at 11:41 PM Khushboo Vashi < >>>> khushboo.vashi@enterprisedb.com> wrote: >>>> >>>>> Hi Joao, >>>>> >>>>> In the test_start_running_query.py, 2 static methods (is_begin_required_for_sql_query >>>>> and is_rollback_statement_required) >>>>> of StartRunningQuery class were used directly without @patch. Due to >>>>> this, in all the cases, the original value of them doesn't restore. >>>>> >>>>> To fix this, I have sent the patch in another thread, to restore its >>>>> original state, but I wonder if we can use these methods with @patch. >>>>> >>>>> Thanks, >>>>> Khushboo >>>>> >>>>> >>>>> On Fri, Feb 9, 2018 at 5:24 PM, Dave Page wrote: >>>>> >>>>>> Support EXPLAIN on Greenplum. Fixes #3097 >>>>>> >>>>>> - 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 >>>>>> >>>>>> Branch >>>>>> ------ >>>>>> master >>>>>> >>>>>> Details >>>>>> ------- >>>>>> >>>>>> https://git.postgresql.org/gitweb?p=pgadmin4.git;a=commitdiff;h=e16a95275336529a734bf0066889e39cc8ef0662 >>>>>> Author: Joao Pedro De Almeida Pereira >>>>>> >>>>>> Modified Files >>>>>> -------------- >>>>>> .../databases/schemas/tables/tests/test_utils.py | 0 >>>>>> web/pgadmin/static/js/sqleditor/execute_query.js | 287 ++++ >>>>>> .../js/sqleditor/is_new_transaction_required.js | 14 + >>>>>> .../static/js/sqleditor/query_tool_actions.js | 33 +- >>>>>> web/pgadmin/tools/sqleditor/__init__.py | 396 +---- >>>>>> web/pgadmin/tools/sqleditor/static/js/sqleditor.js | 227 +-- >>>>>> .../sqleditor/sql/10_plus/explain_plan.sql | 23 + >>>>>> .../sqleditor/sql/9.2_plus/explain_plan.sql | 20 + >>>>>> .../sqleditor/sql/default/explain_plan.sql | 17 + >>>>>> .../sqleditor/sql/gpdb_5.0_plus/explain_plan.sql | 5 + >>>>>> web/pgadmin/tools/sqleditor/tests/__init__.py | 8 + >>>>>> .../sqleditor/tests/test_explain_plan_templates.py | 152 ++ >>>>>> .../test_extract_sql_from_network_parameters.py | 59 + >>>>>> .../tools/sqleditor/tests/test_start_query_tool.py | 38 + >>>>>> web/pgadmin/tools/sqleditor/utils/__init__.py | 14 + >>>>>> .../sqleditor/utils/apply_explain_plan_wrapper.py | 24 + >>>>>> .../tools/sqleditor/utils/constant_definition.py | 32 + >>>>>> .../tools/sqleditor/utils/is_begin_required.py | 169 ++ >>>>>> .../tools/sqleditor/utils/start_running_query.py | 172 ++ >>>>>> .../tools/sqleditor/utils/tests/__init__.py | 8 + >>>>>> .../utils/tests/test_apply_explain_plan_wrapper.py | 121 ++ >>>>>> .../utils/tests/test_start_running_query.py | 445 +++++ >>>>>> .../utils/update_session_grid_transaction.py | 18 + >>>>>> web/pgadmin/utils/compile_template_name.py | 17 + >>>>>> .../utils/tests/test_compile_template_name.py | 34 + >>>>>> web/pgadmin/utils/versioned_template_loader.py | 2 +- >>>>>> web/regression/javascript/fake_endpoints.js | 6 +- >>>>>> .../javascript/sqleditor/execute_query_spec.js | 1702 >>>>>> ++++++++++++++++++++ >>>>>> .../sqleditor/is_new_transaction_required_spec.js | 65 + >>>>>> .../sqleditor/query_tool_actions_spec.js | 141 +- >>>>>> 30 files changed, 3670 insertions(+), 579 deletions(-) >>>>>> >>>>>> >>>>> >>> >>> >>> -- >>> 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 > --001a1140c284d1d68c0566fd4a4b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


On Fri= , Mar 9, 2018 at 11:04 AM Dave Page <dpage@pgadmin.org> wrote:
=
Hi

On Fri, Mar 9, 2018 at 3:54 PM, Joao De Almeida Pereira= <jdealmeidapereira@pivotal.io> wrote:
Hello,
Definitely running sing= le tests is something that would be great, specially if you are TDDing some= thing waiting 30-40 seconds to get feedback is a little cumbersome when the= test you are concerned with take less then a second.

<= div>In the process:
1. Write a test
2. Make the test pa= ss
3. Refactor

Sure, makes sense for development. As I spend 99% of my time review= ing and testing these days, I was just relaying my pain points :-)
=C2=A0

in between each step you run the test more then 1 time= , and depending on the refactoring you might need to run it several times. = So imagine waiting 30 seconds per run to get results. To run a subset of te= sts is a pain because you need to be always changing the way you run the te= sts.....

I believe we could archive a better granu= larity and choosing what test to run if we used a runner like pytest or nos= e to do it. What was the reason behind handrolling a test runner script? I = am asking this because in a previous job I decided to handroll a unittest l= oader script and that was something that I regretted every time I had to to= uch it, and eventually was in the process of changing it to pytest.

Pure newbie-ism. I have = no objections to changing to something else, if it reduces our tech debt.
=C2=A0

I looked into pytest to replace the current th= e current runtest, and the major problem I found was the testscenarios inte= gration(See Note 1). It can be done but we would need to change all the tes= t functions to receive the scenario variables through arguments on the func= tion. Also didn't dug much into setting all the variables that we need = there and all the environment.
The other issue that I do not like= very much about pytest is the fact that you loose the unittest assertion t= hat is not so bad because there are some neat libraries like:=C2=A0https://github.c= om/grappa-py/grappa,=C2=A0https://github.com/ActivisionGameScience= /assertpy,=C2=A0https://github.com/dgilland/verify. Personally I really lik= e the syntax of Grapa, but the Veridfy one is pretty similar to Jasmine too= .

What are your thoughts?
=

Huh, I also really like the grappa syntax= . It's nice and readable.
=C2=A0


<= br>
Note 1: As an example of what our functions would have to loo= k like you can see:=C2=A0https://git= hub.com/OriMenashe/pytest-scenario/blob/master/tests/test_parametrize.py

=C2=A0
class=
 ServersWithServiceIDAddTestCase(BaseTestGenerator):
""" This clas= s will add the servers under default server group. """

scenarios =3D= [
# Fetch the default ur= l for server object
= (
'Defaul= t Server Node url', dict(
url
=3D'/browser/server/obj/'
)
)
]

def setUp(self):
= pass

= def runTest(self):
""" This function will add= the server under default server group."""
url =3D "{0}{1}/".format(self.url, utils.SERVER_GROUP)
# Add service name in the config
se= lf.server['service'] =3D "TestDB"
response =3D self.tester.post(
url<= span style=3D"color:rgb(204,120,50)">,
data=3Djson.dumps(self.server)= ,
conten= t_type=3D'html/json' )
= self.assertEquals(response.sta= tus_code, 200)
response_data =3D json.loads(resp= onse.data.decode('utf-8'))
self.server_id= =3D response_data['node']['_id']

= def tearDown(self):
&q= uot;""This function delete the server from SQLite ""&qu= ot;
= utils.delete_server_with_api(self.tester, self.server_id)
Would h= ave to look changed to:
class ServersWithSe=
rviceIDAddTestCase(object):    ""&q=
uot; This class will add the servers under default server group. "&quo=
t;"
<= br> scenarios =3D [
# Fetch = the default url for server object
(
'Default Server Node url', dict(
= url=3D'/browser/server/obj/'
)
)
]
<= br> def setUp(self= ):
pass
<= span style=3D"color:rgb(204,120,50)">
def runTest(self, url):
""" This function will add the server= under default server group."""
url =3D "{0}{1}/".format(url, utils.SERVER_GROUP)
# Add service name in the config
self.server['= service'] =3D "TestDB= "
respo= nse =3D self.tester.post(
= url,
data=3Djson.dumps(self= .server),
content_type=3D'h= tml/json'
)
self.assertEqua= ls(response.status_code, 200
)
response_data =3D = json.loads(response.data.decode('= utf-8'))
self.server_id =3D response_data[= 9;node']['_id']

def tearDown(self):
"""This function delete the server from SQLite = """
utils.delete_server_with_api(self.tester, <= /span>self.server_id)


Thanks
Joao

On Thu, Mar 8, 2018 at 2:22 PM, Joao De Almeida Pereira <jdealmeidapereira@pivotal.io> wrote:
Hello Khushboo,
Completely forgo= t about this python "feature".......
Attached is the fi= x.

Thanks, applie= d.
=C2=A0

Just as a side question, does anyone else f= eel the pain of wanting to run a single test using a IDE or the command lin= e and not being able to?

Not really - the Python and JS tests are so quick I don't reall= y care (and with the Python ones, I can execute for a single module for eve= n more speed).

What I would *really* like, is the = ability to run individual feature tests. That would be very valuable and sa= ve me a ton of time.

=C2=A0
We an HandRolled the load= er, and that as some implications. Did anyone try to use a different launch= er like pytest or nose instead of the current runner?=C2=A0
I und= erstand that testscenarios is one of the problems we have if we want to mov= e away from this way of running tests.
Any suggestion?
=
Thanks
Joao

On Wed, Mar 7, 2018 at 11:41 PM Khushboo Vashi <khushboo.vashi@enterprisedb.= com> wrote:
Hi Joao,

In the=C2=A0test_start_running= _query.py, 2 static methods (is_begin_required_for_s= ql_query and is_rollback_statement_required)<= /div>
of StartRunningQuery class= were used directly without @patch. Due to this, in = all the cases, the original value of them doesn't restore.
=

To fix this, I h= ave sent the patch in another thread, to restore its original state, but I = wonder if we can use these methods with @patch.

Thanks,
Khushboo


On Fri, Feb 9, 2018 at 5:24 PM, Dave Pag= e <dpage@pgadmin.org> wrote:
Support EXPLAIN on Greenplum. Fixes #3097

=C2=A0- Extract SQLEditor.execute and SQLEditor._poll into their own files = and add test around them
=C2=A0- Extract SQLEditor backend functions that start executing query to t= heir own files and add tests around it
=C2=A0- Move the Explain SQL from the front-end and now pass the Explain pl= an parameters as a JSON object in the start query call.
=C2=A0- 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

Branch
------
master

Details
-------
https://git.postgresql.org/gitweb?p=3Dpgadmin4.git;a=3Dcommitdi= ff;h=3De16a95275336529a734bf0066889e39cc8ef0662
Author: Joao Pedro De Almeida Pereira <jdealmeidapereira@pivotal.io>

Modified Files
--------------
.../databases/schemas/tables/tests/test_utils.py=C2=A0 =C2=A0|=C2=A0 =C2=A0= 0
web/pgadmin/static/js/sqleditor/execute_query.js=C2=A0 =C2=A0|=C2=A0 287 ++= ++
.../js/sqleditor/is_new_transaction_required.js=C2=A0 =C2=A0 |=C2=A0 =C2=A0= 14 +
.../static/js/sqleditor/query_tool_actions.js=C2=A0 =C2=A0 =C2=A0 |=C2=A0 = =C2=A033 +-
web/pgadmin/tools/sqleditor/__init__.py=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 |=C2=A0 396 +----
web/pgadmin/tools/sqleditor/static/js/sqleditor.js |=C2=A0 227 +--
.../sqleditor/sql/10_plus/explain_plan.sql=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0|=C2=A0 =C2=A023 +
.../sqleditor/sql/9.2_plus/explain_plan.sql=C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 =C2=A020 +
.../sqleditor/sql/default/explain_plan.sql=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0|=C2=A0 =C2=A017 +
.../sqleditor/sql/gpdb_5.0_plus/explain_plan.sql=C2=A0 =C2=A0|=C2=A0 =C2=A0= 5 +
web/pgadmin/tools/sqleditor/tests/__init__.py=C2=A0 =C2=A0 =C2=A0 |=C2=A0 = =C2=A0 8 +
.../sqleditor/tests/test_explain_plan_templates.py |=C2=A0 152 ++
.../test_extract_sql_from_network_parameters.py=C2=A0 =C2=A0 |=C2=A0 =C2=A0= 59 +
.../tools/sqleditor/tests/test_start_query_tool.py |=C2=A0 =C2=A038 +
web/pgadmin/tools/sqleditor/utils/__init__.py=C2=A0 =C2=A0 =C2=A0 |=C2=A0 = =C2=A014 +
.../sqleditor/utils/apply_explain_plan_wrapper.py=C2=A0 |=C2=A0 =C2=A024 +<= br> .../tools/sqleditor/utils/constant_definition.py=C2=A0 =C2=A0|=C2=A0 =C2=A0= 32 +
.../tools/sqleditor/utils/is_begin_required.py=C2=A0 =C2=A0 =C2=A0|=C2=A0 1= 69 ++
.../tools/sqleditor/utils/start_running_query.py=C2=A0 =C2=A0|=C2=A0 172 ++=
.../tools/sqleditor/utils/tests/__init__.py=C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 =C2=A0 8 +
.../utils/tests/test_apply_explain_plan_wrapper.py |=C2=A0 121 ++
.../utils/tests/test_start_running_query.py=C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 445 +++++
.../utils/update_session_grid_transaction.py=C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2= =A0 =C2=A018 +
web/pgadmin/utils/compile_template_name.py=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0|=C2=A0 =C2=A017 +
.../utils/tests/test_compile_template_name.py=C2=A0 =C2=A0 =C2=A0 |=C2=A0 = =C2=A034 +
web/pgadmin/utils/versioned_template_loader.py=C2=A0 =C2=A0 =C2=A0|=C2=A0 = =C2=A0 2 +-
web/regression/javascript/fake_endpoints.js=C2=A0 =C2=A0 =C2=A0 =C2=A0 |=C2= =A0 =C2=A0 6 +-
.../javascript/sqleditor/execute_query_spec.js=C2=A0 =C2=A0 =C2=A0| 1702 ++= ++++++++++++++++++
.../sqleditor/is_new_transaction_required_spec.js=C2=A0 |=C2=A0 =C2=A065 +<= br> .../sqleditor/query_tool_actions_spec.js=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0|=C2=A0 141 +-
30 files changed, 3670 insertions(+), 579 deletions(-)


=


--
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsn= ake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Co= mpany



--
Dave P= age
Blog: http= ://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterpri= sedb.com
The Enterprise PostgreSQL Company
--001a1140c284d1d68c0566fd4a4b--