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. # Get Schema Name from its OID.
self._get_schema_name_from_oid(data) 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: if fnid is not None:
# Edit Mode # Edit Mode
if 'provolatile' in data:
data['provolatile'] = vol_dict[data['provolatile']] \
if data['provolatile'] else ''
all_ids_dict = { all_ids_dict = {
'gid': gid, 'gid': gid,

View File

@ -310,7 +310,7 @@ define('pgadmin.node.function', [
},{ },{
id: 'prorows', label: gettext('Estimated rows'), type: 'text', id: 'prorows', label: gettext('Estimated rows'), type: 'text',
deps: ['proretset'], visible: 'isVisible', readonly: 'isReadonly', deps: ['proretset'], visible: 'isVisible', readonly: 'isReadonly',
group: gettext('Options'), group: gettext('Options'),disabled: 'isDisabled',
},{ },{
id: 'proleakproof', label: gettext('Leak proof?'), id: 'proleakproof', label: gettext('Leak proof?'),
group: gettext('Options'), cell:'boolean', type: 'switch', min_version: 90200, group: gettext('Options'), cell:'boolean', type: 'switch', min_version: 90200,
@ -456,6 +456,9 @@ define('pgadmin.node.function', [
return !m.isNew(); return !m.isNew();
case 'prorows': case 'prorows':
if(m.get('proretset') == true) { if(m.get('proretset') == true) {
setTimeout(function() {
m.set('prorows', 0);
}, 10);
return false; return false;
} }
return true; return true;

View File

@ -31,7 +31,6 @@ CREATE{% if query_type is defined %}{{' OR REPLACE'}}{% endif %} FUNCTION {{ con
ROWS {{data.prorows}} ROWS {{data.prorows}}
{% endif %} {% endif %}
{% if data.prosupportfunc %} {% if data.prosupportfunc %}
SUPPORT {{ data.prosupportfunc }} SUPPORT {{ data.prosupportfunc }}
{% endif -%} {% endif -%}
{% if data.variables %}{% for v in data.variables %} {% 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 %} 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 }} 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.proisstrict %}STRICT {% endif %}
{% if data.prosecdef %}SECURITY DEFINER {% endif %} {% if data.prosecdef %}SECURITY DEFINER {% endif %}
{% if data.proiswindow %}WINDOW{% endif %}{% if data.procost %} {% 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 %}
{% 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.proisstrict %}STRICT {% endif %}
{% if data.prosecdef %}SECURITY DEFINER{% endif %} {% if data.prosecdef %}SECURITY DEFINER{% endif %}
{% if data.proparallel and (data.proparallel == 'r' or data.proparallel == 's' or data.proparallel == 'u') %} {% 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 %} {% 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 ('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 %} {% 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", "prorettypename": "trigger",
"prorows": "4321", "prorows": "4321",
"prosecdef": true, "prosecdef": true,
"provolatile": "s", "provolatile": "v",
"prosrc": "begin\nselect 1;\nend;", "prosrc": "begin\nselect 1;\nend;",
"seclabels": [], "seclabels": [],
"variables": [{ "variables": [{
@ -170,7 +170,7 @@
"prorettypename": "event_trigger", "prorettypename": "event_trigger",
"prorows": "4321", "prorows": "4321",
"prosecdef": true, "prosecdef": true,
"provolatile": "s", "provolatile": "v",
"prosrc": "begin\nselect 1;\nend;", "prosrc": "begin\nselect 1;\nend;",
"seclabels": [], "seclabels": [],
"variables": [{ "variables": [{

View File

@ -6,7 +6,7 @@ CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
RETURNS SETOF event_trigger RETURNS SETOF event_trigger
LANGUAGE 'plpgsql' LANGUAGE 'plpgsql'
COST 1234 COST 1234
VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW STABLE LEAKPROOF STRICT SECURITY DEFINER WINDOW
ROWS 4321 ROWS 4321
SET application_name='appname' SET application_name='appname'
AS $BODY$ AS $BODY$

View File

@ -6,7 +6,7 @@ CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
RETURNS SETOF trigger RETURNS SETOF trigger
LANGUAGE 'plpgsql' LANGUAGE 'plpgsql'
COST 1234 COST 1234
VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW STABLE LEAKPROOF STRICT SECURITY DEFINER WINDOW
ROWS 4321 ROWS 4321
SET application_name='appname' SET application_name='appname'
SET search_path=public, pg_temp SET search_path=public, pg_temp

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,7 +4,7 @@
CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
i1 integer) i1 integer)
STABLE SECURITY DEFINER PARALLEL RESTRICTED VOLATILE SECURITY DEFINER PARALLEL RESTRICTED
COST 120 COST 120
SET application_name='pgadmin' SET application_name='pgadmin'
AS begin AS begin

View File

@ -4,7 +4,7 @@
CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"( CREATE OR REPLACE PROCEDURE public."Proc1_$%{}[]()&*^!@""'`\/#"(
i1 integer) i1 integer)
STABLE SECURITY DEFINER PARALLEL RESTRICTED VOLATILE SECURITY DEFINER PARALLEL RESTRICTED
COST 120 COST 120
SET application_name='pgadmin' SET application_name='pgadmin'
AS begin AS begin

View File

@ -6,7 +6,7 @@ CREATE FUNCTION public."Trig1_$%{}[]()&*^!@""'`\/#"()
RETURNS SETOF trigger RETURNS SETOF trigger
LANGUAGE 'plpgsql' LANGUAGE 'plpgsql'
COST 1234 COST 1234
VOLATILE LEAKPROOF STRICT SECURITY DEFINER WINDOW STABLE LEAKPROOF STRICT SECURITY DEFINER WINDOW
ROWS 4321 ROWS 4321
SET application_name='appname' SET application_name='appname'
SET search_path=public, pg_temp SET search_path=public, pg_temp

View File

@ -8,9 +8,16 @@
"data": { "data": {
"name": "Proc1_$%{}[]()&*^!@\"'`\\/#", "name": "Proc1_$%{}[]()&*^!@\"'`\\/#",
"acl": [], "acl": [],
"arguments": [{"argtype": "integer", "argmode": "IN", "argname": "i1", "argdefval": ""}], "arguments": [
{
"argtype": "integer",
"argmode": "IN",
"argname": "i1",
"argdefval": ""
}
],
"funcowner": "enterprisedb", "funcowner": "enterprisedb",
"lanname": "edbspl", "lanname": "plpgsql",
"options": [], "options": [],
"pronamespace": 2200, "pronamespace": 2200,
"prosrc": "begin\nselect 1;\nend;", "prosrc": "begin\nselect 1;\nend;",
@ -25,7 +32,8 @@
"probin": "$libdir/" "probin": "$libdir/"
}, },
"expected_sql_file": "create_procedure.sql" "expected_sql_file": "create_procedure.sql"
}, { },
{
"type": "alter", "type": "alter",
"name": "Alter procedure comment", "name": "Alter procedure comment",
"endpoint": "NODE-procedure.obj_id", "endpoint": "NODE-procedure.obj_id",
@ -35,19 +43,27 @@
}, },
"expected_sql_file": "alter_proc_comment.sql", "expected_sql_file": "alter_proc_comment.sql",
"expected_msql_file": "alter_proc_comment_msql.sql" "expected_msql_file": "alter_proc_comment_msql.sql"
}, { },
{
"type": "alter", "type": "alter",
"name": "Alter procedure param", "name": "Alter procedure param",
"endpoint": "NODE-procedure.obj_id", "endpoint": "NODE-procedure.obj_id",
"provolatile": "s",
"sql_endpoint": "NODE-procedure.sql_id", "sql_endpoint": "NODE-procedure.sql_id",
"data": { "data": {
"variables": { "variables": {
"added": [{"name": "application_name", "value": "pgadmin"}] "added": [
{
"name": "application_name",
"value": "pgadmin"
}
]
} }
}, },
"expected_sql_file": "alter_proc_param.sql", "expected_sql_file": "alter_proc_param.sql",
"expected_msql_file": "alter_proc_param_msql.sql" "expected_msql_file": "alter_proc_param_msql.sql"
}, { },
{
"type": "alter", "type": "alter",
"name": "Alter procedure options", "name": "Alter procedure options",
"endpoint": "NODE-procedure.obj_id", "endpoint": "NODE-procedure.obj_id",
@ -60,7 +76,8 @@
}, },
"expected_sql_file": "alter_proc_opt.sql", "expected_sql_file": "alter_proc_opt.sql",
"expected_msql_file": "alter_proc_opt_msql.sql" "expected_msql_file": "alter_proc_opt_msql.sql"
}, { },
{
"type": "delete", "type": "delete",
"name": "Drop procedure", "name": "Drop procedure",
"endpoint": "NODE-procedure.delete_id", "endpoint": "NODE-procedure.delete_id",

View File

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

View File

@ -53,7 +53,7 @@
"endpoint": "NODE-procedure.obj_id", "endpoint": "NODE-procedure.obj_id",
"sql_endpoint": "NODE-procedure.sql_id", "sql_endpoint": "NODE-procedure.sql_id",
"data": { "data": {
"provolatile": "s", "provolatile": "v",
"proparallel": "r", "proparallel": "r",
"description": "some comment", "description": "some comment",
"procost": "120" "procost": "120"

View File

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