From: Dmitry K. <di...@de...> - 2001-09-13 09:37:41
|
Hello, All! I'm trying to test ParamDSC mechanism with Delphi, and got strange things: (Delphi code is not a question, I'm trying to understand paramdsc itself). I have function declared as declare external function invl int by descriptor, int by descriptor returns int by descriptor entry_point 'iNvl' module_name 'dscexam' and function iNvl(var p1, p2: paramdsc): pparamdsc; cdecl; export; begin if p1.dsc_flags = 1 then // if p1 <> nil then Result:=@p2 else Result:=@p1; end; exactly the same as FBUDF_API paramdsc* iNvl(paramdsc* v, paramdsc* v2) by Claudio Valderrama. it works fine except one case - when I pass expression as a value. Example select iNvl(rating, -1) from customers works OK. If RATING is not null, then RATING is returned. If RATING is null, then -1 returned. But, If I call select iNvl(rating, rating +1) from customers then I got p2 as nil (null) passed into function when RATING is null! I think it is not correct because paramdsc must be passed anyway, but with NULL "value". Am I wrong? If I'm wrong, we have 2 cases: 1. when null value is passed inside variable or parameter paramdsc is filled OK 2. when null value is passed itself - paramdsc address is 0 (nil, null or whatever). Also I've found if this udf returns pointer to nil (null, 0), select will return 0, not null value. I.e. if we want to return null value we must fill correctly paramdsc? I'm confused... Also I've found that if I call select iNvl(rating + 1, rating) from customers that rating + 1 will be INT64 type. But if rating+1 will be null, rating value will be returned, and it will be INTEGER. Isn't it dangerous to mix different data types in one column returned to client? What will happen if first returned UDF value will be integer and all another int64? p.s. excuse me for a lot of questions but now BY DESCRIPTOR seems very misty not only for me... -- Dmitry Kuzmenko, Epsylon Technologies. |