Fixed following issues in the function module:

1) The volatility option is not reflecting. It stays volatile always when creating the function.
2) Set "Returns as set" to true and enter estimated rows like 12. Now set returns as set to false and save.
   It gives ERROR: ROWS is not applicable when the function does not return a set.
   Need to clear estimated rows when returns as set is false.
3) If estimated rows are added and support function is selected then SQL looks ugly.

Fixes #5843
This commit is contained in:
Pradip Parkale
2020-10-12 14:01:04 +05:30
committed by Akshay Joshi
parent fa267805c9
commit 1bb510cdd4
21 changed files with 55 additions and 37 deletions
@@ -1456,12 +1456,11 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
# Get Schema Name from its OID.
self._get_schema_name_from_oid(data)
if 'provolatile' in data:
data['provolatile'] = vol_dict[data['provolatile']]\
if data['provolatile'] else ''
if fnid is not None:
# Edit Mode
if 'provolatile' in data:
data['provolatile'] = vol_dict[data['provolatile']] \
if data['provolatile'] else ''
all_ids_dict = {
'gid': gid,
@@ -310,7 +310,7 @@ define('pgadmin.node.function', [
},{
id: 'prorows', label: gettext('Estimated rows'), type: 'text',
deps: ['proretset'], visible: 'isVisible', readonly: 'isReadonly',
group: gettext('Options'),
group: gettext('Options'),disabled: 'isDisabled',
},{
id: 'proleakproof', label: gettext('Leak proof?'),
group: gettext('Options'), cell:'boolean', type: 'switch', min_version: 90200,
@@ -456,6 +456,9 @@ define('pgadmin.node.function', [
return !m.isNew();
case 'prorows':
if(m.get('proretset') == true) {
setTimeout(function() {
m.set('prorows', 0);
}, 10);
return false;
}
return true;
@@ -31,7 +31,6 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con
ROWS {{data.prorows}}
{% endif %}
{% if data.prosupportfunc %}
SUPPORT {{ data.prosupportfunc }}
{% endif -%}
{% if data.variables %}{% for v in data.variables %}
@@ -17,7 +17,7 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con
RETURNS{% if data.proretset and (data.prorettypename.startswith('SETOF ') or data.prorettypename.startswith('TABLE')) %} {{ data.prorettypename }} {% elif data.proretset %} SETOF {{ data.prorettypename }}{% else %} {{ data.prorettypename }}{% endif %}
LANGUAGE {{ data.lanname|qtLiteral }}
{% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% endif %}
{% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 'STABLE' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% endif %}
{% if data.proisstrict %}STRICT {% endif %}
{% if data.prosecdef %}SECURITY DEFINER {% endif %}
{% if data.proiswindow %}WINDOW{% endif %}{% if data.procost %}
@@ -14,7 +14,7 @@ CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(data.pronamespace, data.name) }}{% i
){% endif %}
{% endif %}
{{ data.provolatile }} {% if data.proleakproof %}LEAKPROOF {% endif %}
{% if data.provolatile %}{% if data.provolatile == 'i' %}IMMUTABLE{% elif data.provolatile == 's' %}STABLE{% else %}VOLATILE{% endif %} {% endif %}{% if data.proleakproof %}LEAKPROOF {% endif %}
{% if data.proisstrict %}STRICT {% endif %}
{% if data.prosecdef %}SECURITY DEFINER{% endif %}
{% if data.proparallel and (data.proparallel == 'r' or data.proparallel == 's' or data.proparallel == 'u') %}
@@ -17,7 +17,7 @@ CREATE OR REPLACE PROCEDURE {{ conn|qtIdent(o_data.pronamespace, name) }}{% if d
)
{% endif %}
{{ data.provolatile }} {% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %}LEAKPROOF{% else %}NOT LEAKPROOF{% endif %}
{% if 'provolatile' in data and data.provolatile %}{{ data.provolatile }} {% elif 'provolatile' not in data and o_data.provolatile %}{{ o_data.provolatile }}{% endif %} {% if ('proleakproof' in data and data.proleakproof) or ('proleakproof' not in data and o_data.proleakproof) %}LEAKPROOF{% else %}NOT LEAKPROOF{% endif %}
{% if ('proisstrict' in data and data.proisstrict) or ('proisstrict' not in data and o_data.proisstrict) %} STRICT{% endif %}
{% if ('prosecdef' in data and data.prosecdef) or ('prosecdef' not in data and o_data.prosecdef) %} SECURITY DEFINER{% endif %}
@@ -119,7 +119,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -170,7 +170,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -6,7 +6,7 @@ CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
RETURNS SETOF event_trigger
LANGUAGE 'plpgsql'
COST 1234
VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
STABLE LEAKPROOF STRICT SECURITY DEFINER WINDOW
ROWS 4321
SET application_name='appname'
AS $BODY$
@@ -6,7 +6,7 @@ CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
RETURNS SETOF trigger
LANGUAGE 'plpgsql'
COST 1234
VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
STABLE LEAKPROOF STRICT SECURITY DEFINER WINDOW
ROWS 4321
SET application_name='appname'
SET search_path=public, pg_temp
@@ -119,7 +119,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -170,7 +170,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -119,7 +119,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -170,7 +170,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -119,7 +119,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -170,7 +170,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -109,7 +109,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -150,7 +150,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -119,7 +119,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -170,7 +170,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -4,7 +4,7 @@
CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
i1 integer)
STABLE SECURITY DEFINER PARALLEL RESTRICTED
VOLATILE SECURITY DEFINER PARALLEL RESTRICTED
COST 120
SET application_name='pgadmin'
AS begin
@@ -4,7 +4,7 @@
CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
i1 integer)
STABLE SECURITY DEFINER PARALLEL RESTRICTED
VOLATILE SECURITY DEFINER PARALLEL RESTRICTED
COST 120
SET application_name='pgadmin'
AS begin
@@ -6,7 +6,7 @@ CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
RETURNS SETOF trigger
LANGUAGE 'plpgsql'
COST 1234
VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW
STABLE LEAKPROOF STRICT SECURITY DEFINER WINDOW
ROWS 4321
SET application_name='appname'
SET search_path=public, pg_temp
@@ -8,9 +8,16 @@
"data": {
"name": "Proc1_$%{}[]()&*^!@\"'`\\/#",
"acl": [],
"arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}],
"arguments": [
{
"argtype": "integer",
"argmode": "IN",
"argname": "i1",
"argdefval": ""
}
],
"funcowner": "enterprisedb",
"lanname": "edbspl",
"lanname": "plpgsql",
"options": [],
"pronamespace": 2200,
"prosrc": "begin\nselect 1;\nend;",
@@ -25,7 +32,8 @@
"probin": "$libdir/"
},
"expected_sql_file": "create_procedure.sql"
}, {
},
{
"type": "alter",
"name": "Alter procedure comment",
"endpoint": "NODE-procedure.obj_id",
@@ -35,19 +43,27 @@
},
"expected_sql_file": "alter_proc_comment.sql",
"expected_msql_file": "alter_proc_comment_msql.sql"
}, {
},
{
"type": "alter",
"name": "Alter procedure param",
"endpoint": "NODE-procedure.obj_id",
"provolatile": "s",
"sql_endpoint": "NODE-procedure.sql_id",
"data": {
"variables": {
"added": [{"name": "application_name", "value": "pgadmin"}]
"added": [
{
"name": "application_name",
"value": "pgadmin"
}
]
}
},
"expected_sql_file": "alter_proc_param.sql",
"expected_msql_file": "alter_proc_param_msql.sql"
}, {
},
{
"type": "alter",
"name": "Alter procedure options",
"endpoint": "NODE-procedure.obj_id",
@@ -60,7 +76,8 @@
},
"expected_sql_file": "alter_proc_opt.sql",
"expected_msql_file": "alter_proc_opt_msql.sql"
}, {
},
{
"type": "delete",
"name": "Drop procedure",
"endpoint": "NODE-procedure.delete_id",
@@ -150,7 +150,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -53,7 +53,7 @@
"endpoint": "NODE-procedure.obj_id",
"sql_endpoint": "NODE-procedure.sql_id",
"data": {
"provolatile": "s",
"provolatile": "v",
"proparallel": "r",
"description": "some comment",
"procost": "120"
@@ -109,7 +109,7 @@
"prorettypename": "trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{
@@ -150,7 +150,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{