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
pull/36/head
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

View File

@ -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,

View File

@ -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;

View File

@ -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 %}

View File

@ -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 %}

View File

@ -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') %}

View File

@ -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 %}

View File

@ -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": [{

View File

@ -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$

View File

@ -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

View File

@ -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": [{

View File

@ -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": [{

View File

@ -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": [{

View File

@ -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": [{

View File

@ -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": [{

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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",

View File

@ -150,7 +150,7 @@
"prorettypename": "event_trigger",
"prorows": "4321",
"prosecdef": true,
"provolatile": "s",
"provolatile": "v",
"prosrc": "begin\nselect 1;\nend;",
"seclabels": [],
"variables": [{

View File

@ -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"

View File

@ -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": [{