[freetds] SP input parameter problem on 0.63
ZIGLIO, Frediano, VF-IT
Frediano.Ziglio at vodafone.com
Tue Aug 9 02:46:23 EDT 2005
>
> First of all, thanks so much everyone for your help so far.
>
> I applied Frediano Zigliano's patch to rpc.c in 0.63 and added some
> crude debugging code of my own ... I'm still running into problems at
> that one particular spot (maxlen fails validation) but I'm
> also running
> into unexpected results that involve ADODB.
>
> Just for review, here's the SP I'm working with:
>
> CREATE proc sp_Team_WLT
> @TeamAllocId int,
> @LeagueId int,
> @SeasonID int,
> @BUId int,
> @SportId int,
> @TeamGenderCd char(4),
> @RS varchar(8000) OUTPUT
> AS (etc. etc. etc.)
>
> Now by my understanding maxlen should have a value of -1 for
> non-OUTPUT
> parameters. But for some reason ADODB calls mssql_bind with maxlen =
> 4000 by default for all parameters (at least in 4.60 and 4.65
> it does).
> Sometimes it doesn't seem to matter, but sometimes it does
> matter as you
> can see below:
>
> 17:24:29.003317 dbrpcinit() added rpcname "sp_Team_WLT"
> 17:24:29.003649 Trying to bind parameter "@TeamAllocId"
> 17:24:29.003726 dbrpcparam() added parameter "@TeamAllocId"
> 17:24:29.003953 Trying to bind parameter "@LeagueId"
> 17:24:29.004017 dbrpcparam() added parameter "@LeagueId"
> 17:24:29.004217 Trying to bind parameter "@SeasonID"
> 17:24:29.004273 Died at 191 Trying to bind parameter with maxlen 4000
> 17:24:29.004822 Trying to bind parameter "@BUid"
> 17:24:29.004903 dbrpcparam() added parameter "@BUid"
> 17:24:29.005112 Trying to bind parameter "@SportId"
> 17:24:29.005169 Died at 191 Trying to bind parameter with maxlen 4000
> 17:24:29.005579 Trying to bind parameter "@TeamGenderCd"
> 17:24:29.005680 Died at 191 Trying to bind parameter with maxlen 4000
> 17:24:29.006220 Trying to bind parameter "@RS"
> 17:24:29.006304 dbrpcparam() added parameter "@RS"
> 17:24:29.006507 dbrpcsend()
>
> Note that line 191 reported above corresponds to this line of the
> patched version of rpc.c.
>
> + if (maxlen != -1 && maxlen != 0)
>
> As you can see all parameters bind successfully except for @SeasonID,
> @SportId and @TeamGenderCd. One thing in common with those three
> parameters: data type. The developer is passing string
> arguments to the
> PHP ADODB InParameter() method.
>
> Any insight would be greatly appreciated. Thanks!
>
Try removing
if (maxlen != -1 && maxlen != 0)
return FAIL;
lines. However PHP is passing wrong parameters... maxlen should not be
4000 for input parameters but -1 (0 from MS specification is string is
null...)
It would be correct to change these line in php_mssql.c (mssql_bind)
if (is_output) {
status=DBRPCRETURN;
}
to
if (is_output) {
status=DBRPCRETURN;
} else {
maxlen = -1;
}
Or change these lines
case 7: {
zval **yyis_output, **yyis_null, **yymaxlen;
if (zend_get_parameters_ex(7, &stmt, ¶m_name, &var, &yytype,
&yyis_output, &yyis_null, &yymaxlen)==FAILURE){
RETURN_FALSE;
}
convert_to_long_ex(yytype);
convert_to_long_ex(yyis_output);
convert_to_long_ex(yyis_null);
convert_to_long_ex(yymaxlen);
type=Z_LVAL_PP(yytype);
is_output=Z_LVAL_PP(yyis_output);
is_null=Z_LVAL_PP(yyis_null);
maxlen=Z_LVAL_PP(yymaxlen);
}
break;
with
case 7: {
zval **yyis_output, **yyis_null, **yymaxlen;
if (zend_get_parameters_ex(7, &stmt, ¶m_name, &var, &yytype,
&yyis_output, &yyis_null, &yymaxlen)==FAILURE) {
RETURN_FALSE;
}
convert_to_long_ex(yytype);
convert_to_long_ex(yyis_output);
convert_to_long_ex(yyis_null);
convert_to_long_ex(yymaxlen);
type=Z_LVAL_PP(yytype);
is_output=Z_LVAL_PP(yyis_output);
is_null=Z_LVAL_PP(yyis_null);
maxlen=Z_LVAL_PP(yymaxlen);
if (!is_output)
maxlen = -1;
}
break;
freddy77
More information about the FreeTDS
mailing list