[Monetdb-developers] M4 Automatic multiplex version of .tostr: weird behavior

Lefteris lsidir at gmail.com
Sun Feb 1 14:20:18 CET 2009


On Sun, Feb 1, 2009 at 2:00 PM, Stefan Manegold <Stefan.Manegold at cwi.nl> wrote:
> On Sun, Feb 01, 2009 at 01:03:43PM +0100, Lefteris wrote:
>> The following behavior is strange to me, but I am not sure if it is a
>> bug or I have done something wrong.
>>
>> dayTimeDuration (dtduration) is defined in mil as:
>>
>> .ATOM dtduration = lng;
>>      .FROMSTR = dtduration_fromstr;
>>      .TOSTR = dtduration_tostr;
>> .END;
>>
>> and in c as :
>> typedef long long dtduration;
>          ^^^^^^^^^
> why not "lng" as above?

fixed

>
> (well, yes, "lng" is defined as "long long", so it should not make a
> difference other than looking more consistent, and hence, being easier to
> maintain ...)
>
> also
> #define dtduration_nil ((dtduration) int_nil)
>                                     ^^^
> should probabaly read
> #define dtduration_nil ((dtduration) lng_nil)
>                                     ^^^
> right?
right, fixed

>
>> also .tostr has the following sign.
>> int dtduration_tostr(str *buf, int *len, dtduration *val)
>>
>> you can find all this in MonetDB4/src/modules/plain/monettime.mx
>>
>> Now, if I do either:
>> dtduration("P12DT1H").print()
>> [dtduration]("P12DT1H").print()
>>
>> I get the correct value printed. But if I create a BAT (void,str):
>> var a0006 := new (void,str).seqbase (0 at 0);
>> a0006.append("P12DT1H");
>>
>> and do:
>> [dtduration](a0006).print();
>> It gives back "PT0S", which means 0 duration, and thus the value of
>> *val in dtduration_tostr is 0 (I checked that).
>
> a) your example are casting from str to dtduration --- so what has
>   dtduration_*to*str() to do with this? Typo?
>   IMHO, casting from str to dtduration should be handled by
>   dtduration_*from*str(), right?

yes but the .print() is casting back to string:P so it goes str->dtduration->str
The process was going wrong not from string to dtduration, but when it
was printed back, the dtduration had the correct long value.

>
>   ... of course, printing then IMHO uses dtduration_*to*str() to turn the
>   dtduration into a (printable) string, again...
>
> b) hence, you'd need to check all input and output parameters of both
>   dtduration_tostr and dtduration_fromstr to check whether things might go
>   wrong ...
>   ... if *val in dtduration_tostr (usd by print) is 0, then the
>   (multiplxed) cast from a [void,str] BAT to a [void,dtduration] BAT using
>   dtduration_fromstr might already have introduced the problem ...

the fromstr was ok, it was just the tostr that I was changing the val
to 0 and the multiplex called again the tostr with 0.

Thank for your fast replies:)

lefteris

>
>> So, could that be some bug with correct dealing of long values in the
>> multiplex creation (btw. where is that happening?)
>
> MonetDB4/src/monet/monet_multiplex.mx
>
>> Or am I missing
>> some special case that I should take into consideration with long
>> values?
>>
>> Thank you,
>>
>> lefteris
>>
>> P.S. yearMonthDuration which is defined as int works like a charm.
>
> check, whether there are more place where the int->lng translation did not
> go well like with dtduration_nil above ...
>
> Stefan
>
>
>> ------------------------------------------------------------------------------
>> This SF.net email is sponsored by:
>> SourcForge Community
>> SourceForge wants to tell your story.
>> http://p.sf.net/sfu/sf-spreadtheword
>> _______________________________________________
>> Monetdb-developers mailing list
>> Monetdb-developers at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/monetdb-developers
>>
>
> --
> | Dr. Stefan Manegold | mailto:Stefan.Manegold at cwi.nl |
> | CWI,  P.O.Box 94079 | http://www.cwi.nl/~manegold/  |
> | 1090 GB Amsterdam   | Tel.: +31 (20) 592-4212       |
> | The Netherlands     | Fax : +31 (20) 592-4312       |
>




More information about the developers-list mailing list