Hi Dave, On Wed, May 10, 2017 at 2:06 PM, Dave Page <dp...@pgadmin.org> wrote:
> Any chance we can get this wrapped up today Surinder? > I have fixed RM case, I am currently writing its feature test cases which is taking some time. Should I send patch for RM case only? I will try to complete test cases by today eod. > > On Tue, May 9, 2017 at 11:29 AM, Dave Page <dp...@pgadmin.org> wrote: > >> >> >> On Tue, May 9, 2017 at 11:03 AM, Surinder Kumar < >> surinder.ku...@enterprisedb.com> wrote: >> >>> Hi Dave, >>> >>> On Mon, May 8, 2017 at 4:37 PM, Dave Page <dp...@pgadmin.org> wrote: >>> >>>> >>>> >>>> On Mon, May 8, 2017 at 11:51 AM, Surinder Kumar < >>>> surinder.ku...@enterprisedb.com> wrote: >>>> >>>>> Hi >>>>> >>>>> On Mon, May 8, 2017 at 3:51 PM, Dave Page <dp...@pgadmin.org> wrote: >>>>> >>>>>> Hi >>>>>> >>>>>> On Mon, May 8, 2017 at 11:13 AM, Surinder Kumar < >>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>> >>>>>>> Hi Dave, >>>>>>> >>>>>>> On Mon, May 8, 2017 at 3:28 PM, Dave Page <dp...@pgadmin.org> wrote: >>>>>>> >>>>>>>> Hi >>>>>>>> >>>>>>>> On Fri, May 5, 2017 at 12:52 PM, Surinder Kumar < >>>>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>>>> >>>>>>>>> Hi Dave, >>>>>>>>> >>>>>>>>> The support to handle [null] and [default] values is added for >>>>>>>>> following formatters: >>>>>>>>> - JsonFormatter >>>>>>>>> - NumbersFormatter >>>>>>>>> - CheckmarkFormatter >>>>>>>>> - TextFormatter >>>>>>>>> >>>>>>>>> Previously when a new row is added, it was not validating each and >>>>>>>>> every cell for columns with attribute not_null = true. >>>>>>>>> Introduced a new function validateRow(...) which is called on >>>>>>>>> adding a new row, it validates each cell with column having >>>>>>>>> attribute(not_null=true). the corresponding cell will highlighted and >>>>>>>>> save >>>>>>>>> button will be disabled if value is [null]. >>>>>>>>> >>>>>>>> >>>>>>>> I'm not sure that behaviour is right. What I now see (given the >>>>>>>> table below) is that: >>>>>>>> >>>>>>>> - If I click in the id field of a new row, it forces me to enter a >>>>>>>> value or hit escape. Why is it trying to force me? It's a serial >>>>>>>> field, so >>>>>>>> will get a value on save anyway. >>>>>>>> >>>>>>> Yes, It is because I am validating all cell values after it >>>>>>> renders. It will reverted back. >>>>>>> >>>>>>>> >>>>>>>> - If I do enter a value in the ID field, focus jumps over all the >>>>>>>> other fields with either a default or no 'not null' option to the >>>>>>>> data_no_nulls column. Focus should always go to the next field. >>>>>>>> >>>>>>>> I think this addition can just be removed - I'm pretty sure the >>>>>>>> previous behaviour would have been what we want, with the additional >>>>>>>> formatters fixed. >>>>>>>> >>>>>>> But If i remove this addition, the value for column like >>>>>>> 'data_no_nulls' will be set to '' (blank string), then on save its >>>>>>> value >>>>>>> will be validated on the server side and whatever the error message is >>>>>>> will >>>>>>> be returned back (the same behaviour as in pgAdmin3) >>>>>>> >>>>>> >>>>>> Which is fine I think. If you want to leave the validation there, >>>>>> that's also fine - but, it a) shouldn't require me to press Esc if I >>>>>> decide >>>>>> not to fill in that value yet, and b) shouldn't change the tab order of >>>>>> the >>>>>> fields. It's also broken of course, in that it was trying to force me to >>>>>> enter a value for a not-null field with a default. >>>>>> >>>>> Yes, I will check if we just highlight the field and don't force the >>>>> user to enter value. >>>>> This will enable user to edit any field using TAB key even if required >>>>> field is highlighted red. >>>>> Should the save button remains disable untill user enters any valid >>>>> value in 'data_no_nulls' column ? >>>>> >>>> >>>> I think that's fine, yes - as long as we get the validation right :-) >>>> >>> For highlighting the error field and enable user to navigate to other >>> cells using TAB key, >>> I spend some time looking and debugging into the code and found that it >>> requires lot of changes in slick.grid.js core functions as there are no >>> event listeners provided to listen and changes in core file is not >>> preferred. It may also break other functionalities as code is quite complex. >>> So, I think we should validate data on server side and display any error >>> messages on UI. >>> >> >> OK. >> >> >>> >>>>>> >>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> Now I will add more feature test cases for remaining formatters. >>>>>>>>> Will send separate patch for feature test cases once completed. >>>>>>>>> >>>>>>>> >>>>>>>> Thanks. >>>>>>>> >>>>>>>> >>>>>>>>> >>>>>>>>> Please review updated patch. >>>>>>>>> >>>>>>>>> >>>>>>>>> On Tue, May 2, 2017 at 5:57 PM, Surinder Kumar < >>>>>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>>>>> >>>>>>>>>> Hi Dave, >>>>>>>>>> >>>>>>>>>> On Tue, May 2, 2017 at 5:21 PM, Dave Page <dp...@pgadmin.org> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Hi, >>>>>>>>>>> >>>>>>>>>>> This is looking much better now :-). Couple of thoughts and a >>>>>>>>>>> bug: >>>>>>>>>>> >>>>>>>>>>> - Only the TextFormatter seems to handle both [null] and >>>>>>>>>>> [default] values. Shouldn't all formatters do so (including Json and >>>>>>>>>>> Checkmark)? >>>>>>>>>>> >>>>>>>>>> Yes, I will apply the same changes for other formatters too. >>>>>>>>>> >>>>>>>>>>> For example, "serial" columns currently get displayed as [null] >>>>>>>>>>> when left blank, but I would expect to see [default]. >>>>>>>>>>> >>>>>>>>>>> - I would suggest we put [null] and [default] in a lighter >>>>>>>>>>> colour - #999999. >>>>>>>>>>> >>>>>>>>>>> - With the feature test patch added, I seem to be consistently >>>>>>>>>>> getting the following failure (immediately after your new tests >>>>>>>>>>> run): >>>>>>>>>>> >>>>>>>>>>> ============================================================ >>>>>>>>>>> ========== >>>>>>>>>>> ERROR: runTest (pgadmin.feature_tests.xss_che >>>>>>>>>>> cks_panels_and_query_tool_test.CheckForXssFeatureTest) >>>>>>>>>>> Test XSS check for panels and query tool >>>>>>>>>>> ------------------------------------------------------------ >>>>>>>>>>> ---------- >>>>>>>>>>> Traceback (most recent call last): >>>>>>>>>>> File "/Users/dpage/git/pgadmin4/web >>>>>>>>>>> /regression/feature_utils/base_feature_test.py", line 42, in >>>>>>>>>>> setUp >>>>>>>>>>> self._screenshot() >>>>>>>>>>> File "/Users/dpage/git/pgadmin4/web >>>>>>>>>>> /regression/feature_utils/base_feature_test.py", line 92, in >>>>>>>>>>> _screenshot >>>>>>>>>>> python_version)) >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 802, in get_screenshot_as_file >>>>>>>>>>> png = self.get_screenshot_as_png() >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 821, in get_screenshot_as_png >>>>>>>>>>> return base64.b64decode(self.get_scre >>>>>>>>>>> enshot_as_base64().encode('ascii')) >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 831, in get_screenshot_as_base64 >>>>>>>>>>> return self.execute(Command.SCREENSHOT)['value'] >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 238, in execute >>>>>>>>>>> self.error_handler.check_response(response) >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", >>>>>>>>>>> line 193, in check_response >>>>>>>>>>> raise exception_class(message, screen, stacktrace) >>>>>>>>>>> UnexpectedAlertPresentException: Alert Text: None >>>>>>>>>>> Message: unexpected alert open: {Alert text : Are you sure you >>>>>>>>>>> wish to close the pgAdmin 4 browser?} >>>>>>>>>>> (Session info: chrome=58.0.3029.81) >>>>>>>>>>> (Driver info: chromedriver=2.29.461585 >>>>>>>>>>> (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b),platform=Mac OS X >>>>>>>>>>> 10.12.3 x86_64) >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> ============================================================ >>>>>>>>>>> ========== >>>>>>>>>>> ERROR: runTest (pgadmin.feature_tests.xss_che >>>>>>>>>>> cks_pgadmin_debugger_test.CheckDebuggerForXssFeatureTest) >>>>>>>>>>> Test table DDL generation >>>>>>>>>>> ------------------------------------------------------------ >>>>>>>>>>> ---------- >>>>>>>>>>> Traceback (most recent call last): >>>>>>>>>>> File "/Users/dpage/git/pgadmin4/web >>>>>>>>>>> /regression/feature_utils/base_feature_test.py", line 42, in >>>>>>>>>>> setUp >>>>>>>>>>> self._screenshot() >>>>>>>>>>> File "/Users/dpage/git/pgadmin4/web >>>>>>>>>>> /regression/feature_utils/base_feature_test.py", line 92, in >>>>>>>>>>> _screenshot >>>>>>>>>>> python_version)) >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 802, in get_screenshot_as_file >>>>>>>>>>> png = self.get_screenshot_as_png() >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 821, in get_screenshot_as_png >>>>>>>>>>> return base64.b64decode(self.get_scre >>>>>>>>>>> enshot_as_base64().encode('ascii')) >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 831, in get_screenshot_as_base64 >>>>>>>>>>> return self.execute(Command.SCREENSHOT)['value'] >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", >>>>>>>>>>> line 238, in execute >>>>>>>>>>> self.error_handler.check_response(response) >>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>> dmin4/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", >>>>>>>>>>> line 193, in check_response >>>>>>>>>>> raise exception_class(message, screen, stacktrace) >>>>>>>>>>> UnexpectedAlertPresentException: Alert Text: None >>>>>>>>>>> Message: unexpected alert open: {Alert text : Are you sure you >>>>>>>>>>> wish to close the pgAdmin 4 browser?} >>>>>>>>>>> (Session info: chrome=58.0.3029.81) >>>>>>>>>>> (Driver info: chromedriver=2.29.461585 >>>>>>>>>>> (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b),platform=Mac OS X >>>>>>>>>>> 10.12.3 x86_64) >>>>>>>>>>> >>>>>>>>>> Sure. I will fix this. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Thanks! >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Fri, Apr 28, 2017 at 10:19 AM, Surinder Kumar < >>>>>>>>>>> surinder.ku...@enterprisedb.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Dave, >>>>>>>>>>>> >>>>>>>>>>>> Please find updated patch for RM case and a separate patch for >>>>>>>>>>>> Feature tests. >>>>>>>>>>>> >>>>>>>>>>>> *Python:* >>>>>>>>>>>> >>>>>>>>>>>> - Added [default] label for cells with default values while >>>>>>>>>>>> inserting a new row. >>>>>>>>>>>> >>>>>>>>>>>> - Introduced a FieldValidator function for cells that don't >>>>>>>>>>>> allow null values. If user tries to insert null value, field with >>>>>>>>>>>> be >>>>>>>>>>>> highlighted with red borders around. >>>>>>>>>>>> >>>>>>>>>>>> - >>>>>>>>>>>> If a cell contains blank string('') and when we set it to null, >>>>>>>>>>>> the change into the cell is not detected. It was because the >>>>>>>>>>>> comparison >>>>>>>>>>>> for (defaultValue == null) return true if defaultValue is >>>>>>>>>>>> undefined. Hence _.isNull(value) is used to fix this. >>>>>>>>>>>> >>>>>>>>>>>> *Feature Test cases:* >>>>>>>>>>>> >>>>>>>>>>>> - Introduced a new method create_table_with_query(server, >>>>>>>>>>>> db_name, query) in test_utils.py which executes the given >>>>>>>>>>>> query on connected server. >>>>>>>>>>>> >>>>>>>>>>>> - Added a new file test_data.json that has test data for test >>>>>>>>>>>> cases. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Fri, Apr 7, 2017 at 2:21 PM, Dave Page <dp...@pgadmin.org> >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hi >>>>>>>>>>>>> >>>>>>>>>>>>> On Sat, Apr 1, 2017 at 12:45 PM, Surinder Kumar >>>>>>>>>>>>> <surinder.ku...@enterprisedb.com> wrote: >>>>>>>>>>>>> > Hi >>>>>>>>>>>>> > >>>>>>>>>>>>> > Issues fixed: >>>>>>>>>>>>> > >>>>>>>>>>>>> > 1. If a column is defined with a default modifier, there is >>>>>>>>>>>>> now way to >>>>>>>>>>>>> > insert the row with those defaults. >>>>>>>>>>>>> > The column will be left blank and it will take default value >>>>>>>>>>>>> automatically. >>>>>>>>>>>>> > >>>>>>>>>>>>> > 2. If a column has a not-null constraint then an error is >>>>>>>>>>>>> returned and the >>>>>>>>>>>>> > row is not inserted. >>>>>>>>>>>>> > The column will be left blank >>>>>>>>>>>>> > >>>>>>>>>>>>> > The default values for new added rows will be displayed on >>>>>>>>>>>>> refresh/execute. >>>>>>>>>>>>> > >>>>>>>>>>>>> > Please find attached patch and review. >>>>>>>>>>>>> >>>>>>>>>>>>> This largely works as expected, but there is some weirdness. I >>>>>>>>>>>>> have a >>>>>>>>>>>>> test table that looks like this: >>>>>>>>>>>>> >>>>>>>>>>>>> CREATE TABLE public.defaults >>>>>>>>>>>>> ( >>>>>>>>>>>>> id bigint NOT NULL DEFAULT nextval('defaults_id_seq'::reg >>>>>>>>>>>>> class), >>>>>>>>>>>>> data_default_nulls text COLLATE pg_catalog."default" >>>>>>>>>>>>> DEFAULT 'abc123'::text, >>>>>>>>>>>>> data_default_no_nulls text COLLATE pg_catalog."default" >>>>>>>>>>>>> NOT NULL >>>>>>>>>>>>> DEFAULT 'def456'::text, >>>>>>>>>>>>> data_nulls text COLLATE pg_catalog."default", >>>>>>>>>>>>> data_no_nulls text COLLATE pg_catalog."default" NOT NULL, >>>>>>>>>>>>> CONSTRAINT defaults_pkey PRIMARY KEY (id) >>>>>>>>>>>>> ) >>>>>>>>>>>>> >>>>>>>>>>>>> Remember that the expected behaviour is: >>>>>>>>>>>>> >>>>>>>>>>>>> - Set a value to empty to update the column to null. >>>>>>>>>>>>> - Set a value to '' to update the column to an empty string >>>>>>>>>>>>> - Set a value to anything else to update the column to that >>>>>>>>>>>>> value >>>>>>>>>>>>> >>>>>>>>>>>>> 1) In a row with values in each column, if I try to set the >>>>>>>>>>>>> value of >>>>>>>>>>>>> data_default_nulls to null, the query executed is: >>>>>>>>>>>>> >>>>>>>>>>>>> UPDATE public.defaults SET >>>>>>>>>>>>> data_default_nulls = '' WHERE >>>>>>>>>>>>> id = '2'; >>>>>>>>>>>>> >>>>>>>>>>>>> 2) If I do the same in the data_nulls column, the value is >>>>>>>>>>>>> immediately >>>>>>>>>>>>> shown as [null] and the query executed is: >>>>>>>>>>>>> >>>>>>>>>>>>> UPDATE public.defaults SET >>>>>>>>>>>>> data_nulls = NULL WHERE >>>>>>>>>>>>> id = '2'; >>>>>>>>>>>>> >>>>>>>>>>>>> 3) If I then edit the value in data_default_nulls, it shows the >>>>>>>>>>>>> current value as ''. Removing the quotes (to set it to null) >>>>>>>>>>>>> doesn't >>>>>>>>>>>>> get detected as a change. >>>>>>>>>>>>> >>>>>>>>>>>> Taken care. >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 4) When I manually executed "update defaults set >>>>>>>>>>>>> data_default_nulls = >>>>>>>>>>>>> null where id = 2" in a query tool window, I got: >>>>>>>>>>>>> >>>>>>>>>>>>> 2017-04-07 09:43:02,987: INFO werkzeug: 127.0.0.1 - - >>>>>>>>>>>>> [07/Apr/2017 >>>>>>>>>>>>> 09:43:02] "GET /sqleditor/columns/8745675 HTTP/1.1" 500 - >>>>>>>>>>>>> Traceback (most recent call last): >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 2000, in __call__ >>>>>>>>>>>>> return self.wsgi_app(environ, start_response) >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1991, in wsgi_app >>>>>>>>>>>>> response = self.make_response(self.handle_exception(e)) >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1567, in handle_exception >>>>>>>>>>>>> reraise(exc_type, exc_value, tb) >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1988, in wsgi_app >>>>>>>>>>>>> response = self.full_dispatch_request() >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1641, in full_dispatch_request >>>>>>>>>>>>> rv = self.handle_user_exception(e) >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1544, in handle_user_exception >>>>>>>>>>>>> reraise(exc_type, exc_value, tb) >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1639, in full_dispatch_request >>>>>>>>>>>>> rv = self.dispatch_request() >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask/app.py", >>>>>>>>>>>>> line 1625, in dispatch_request >>>>>>>>>>>>> return self.view_functions[rule.endpoint](**req.view_args) >>>>>>>>>>>>> File "/Users/dpage/.virtualenvs/pga >>>>>>>>>>>>> dmin4/lib/python2.7/site-packages/flask_login.py", >>>>>>>>>>>>> line 792, in decorated_view >>>>>>>>>>>>> return func(*args, **kwargs) >>>>>>>>>>>>> File "/Users/dpage/git/pgadmin4/web >>>>>>>>>>>>> /pgadmin/tools/sqleditor/__init__.py", >>>>>>>>>>>>> line 452, in get_columns >>>>>>>>>>>>> tid=command_obj.obj_id) >>>>>>>>>>>>> AttributeError: 'QueryToolCommand' object has no attribute >>>>>>>>>>>>> 'obj_id' >>>>>>>>>>>>> >>>>>>>>>>>> Fixed. >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> 5) When I run the query again in pgAdmin III, then refresh the >>>>>>>>>>>>> data in >>>>>>>>>>>>> pgAdmin 4, the data_default_nulls column is displayed without >>>>>>>>>>>>> the >>>>>>>>>>>>> [null] marker (despite having a null value, which I confirmed >>>>>>>>>>>>> in >>>>>>>>>>>>> pgAdmin 3). >>>>>>>>>>>>> >>>>>>>>>>>> Fixed. >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> I'm sure there are other combinations of issues here. Please >>>>>>>>>>>>> fix and >>>>>>>>>>>>> thoroughly re-test to ensure behaviour is consistent - and to >>>>>>>>>>>>> avoid >>>>>>>>>>>>> future issues, please add some appropriate feature tests to >>>>>>>>>>>>> check >>>>>>>>>>>>> nulls, defaults and empty strings are properly handled in >>>>>>>>>>>>> view, insert >>>>>>>>>>>>> and updates. Murtuza recently wrote some feature tests for the >>>>>>>>>>>>> query >>>>>>>>>>>>> tool - you should be able to use those as a starting point. >>>>>>>>>>>>> >>>>>>>>>>>> Added feature tests >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks. >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> 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 >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 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 >> > > > > -- > Dave Page > Blog: http://pgsnake.blogspot.com > Twitter: @pgsnake > > EnterpriseDB UK: http://www.enterprisedb.com > The Enterprise PostgreSQL Company >