I have no idea if you have the necessary information about the type, but this should not be reported:
DECLARE
TYPE t IS TABLE OF PLS_INTEGER;
x t;
BEGIN
x := NEW t( 1, 2, 3, 4, 5 );
END;
I have no idea if you have the necessary information about the type, but this should not be reported:
DECLARE
TYPE t IS TABLE OF PLS_INTEGER;
x t;
BEGIN
x := NEW t( 1, 2, 3, 4, 5 );
END;
You're fully right.
I changed the 2752 expression to the following:
//PARAM_LIST [count(PARAM) >= (:MIN_PARAMS:)5(:/MIN_PARAMS:)]
[PARAM [not(PARAM_NAME)]] (: at least one unnamed parameter :)
/parent::QNAME [not(parent::EXPR/@cat="type_constructor")]
/IDENTIFIER [last()]
[not(qp5:is-built-in-function(@value))]
I also added a parameter MIN_PARAMS which will allow you to set the threshold.
Issue QP-4010. Expect it in the beta of the next few weeks.
Thanks for the feedback!
Andre
Thanks!
Looks like this would then fail to detect a type constructor (either record or object type) where parameters could/should be named though?
DECLARE
TYPE t IS RECORD ( x1 PLS_INTEGER, x2 PLS_INTEGER, x3 PLS_INTEGER, x4 PLS_INTEGER, x5 PLS_INTEGER );
v t;
BEGIN
v := NEW t( 1, 2, 3, 4, 5 );
END;
Not sure what you mean.
A constructor with name parameters would look like this:
v := NEW t( x1=>1, x2=>2, x3=>3, x4=>4, x5=>5 );
or
v := NEW t( 1, 2, x3=>3, x4=>4, x5=>5 );
and none of those would be flagged, because it are constructors.
Or did I miss something?
I guess that your changed rule would not flag my latest example any more (because it is also a type constructor) .
It should be flagged though since named parameters are possible (as in your examples) but not used.
Right of course, in the RECORD case it looks like a method call, but the TABLE case fills up values. So my mod is not good yet.
Okay, will need a bit more work, let's see what can be done.
Hi Peter,
I came up with the following:
declare function TableOrVarrayTypeOfQName()
{
./(
let $qname := .
return ./ancestor::BLOCK/STMT/DECL_SET/TYPE_SPEC[TYPE/@cat=("varray", "nested_table")]
[QNAME/@value=$qname/IDENTIFIER/@value]
)
}
//PARAM_LIST [count(PARAM) >= (:MIN_PARAMS:)5(:/MIN_PARAMS:)]
[PARAM [not(PARAM_NAME)]] (: at least one unnamed parameter :)
/parent::QNAME [not(TableOrVarrayTypeOfQName())]
/IDENTIFIER [last()]
[not(qp5:is-built-in-function(@value))]
Here's some example text that I used (you can swap decl blocks by swapping the comments):
DECLARE
TYPE nt IS TABLE OF PLS_INTEGER;
my_nt nt;
TYPE va IS VARRAY (100) OF PLS_INTEGER;
my_va va;
TYPE rt IS RECORD ( x1 PLS_INTEGER, x2 PLS_INTEGER, x3 PLS_INTEGER, x4 PLS_INTEGER, x5 PLS_INTEGER );
my_rt rt;
BEGIN
BEGIN
DECLARE
PROCEDURE p
IS
--TYPE nt IS TABLE OF PLS_INTEGER;
--my_nt nt;
--TYPE va IS VARRAY (100) OF PLS_INTEGER;
--my_va va;
--TYPE rt IS RECORD ( x1 PLS_INTEGER, x2 PLS_INTEGER, x3 PLS_INTEGER, x4 PLS_INTEGER, x5 PLS_INTEGER );
--my_rt rt;
BEGIN
my_nt := nt( 1, 2, 3, 4, 5, 6 );
my_va := va( 1, 2, 3, 4, 5, 6 );
my_rt := rt( 1, 2, x3=>3, x4=>4, x5=>5 );
END;
BEGIN
NULL;
END;
END;
END;
Only rt
on the line my_rt := rt( 1, 2, x3=>3, x4=>4, x5=>5 )
should be flagged.
Feel free to try it out. I'll keep the above as a fix, after some more testing.
Andre
Component QP5.dll version 5.391 now contains a new expression for this rule. Should be part of Toad soon.