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

Lefteris lsidir at gmail.com
Sun Feb 1 14:15:06 CET 2009

I will use lng instead of long long:)

goto's are needed in the fromstr to make a faster and easier to read parser.

The nil value should be indeed lng_nil, i had changed that but did not
checked it in.

After debugging more, I saw that tostr is called twice and yes, I have
changed it to 0 in the process.. I didn't knew that tostr is called
twice for the same value, but now I know. I was surprised by that, but
now from your email I understand that you already know that and
apparently this is the correct behavior:)

I fixed it by indeed copying val to some temp variable.

Thank you very much.


On Sun, Feb 1, 2009 at 1:55 PM, Sjoerd Mullender <sjoerd at acm.org> wrote:
> There are several issues.
> - Use lng instead of long long for the typedef.  The Visual Studio compiler
> doesn't know long long.
> - You're using a lot of goto's...
> - The nil value for dtduration should be lng_nil, not int_nil.
> But the real reason that it fails is that for some reason dtduration_tostr
> is called twice with the same argument, and the *second* time it is called,
> the value of *val == 0.  That is because the *first* time it was called, you
> set it to 0 in the process of figuring out what string to produce.
> So the solution is probably to make a copy of *val into a local variable and
> change that instead of *val.
> On 2009-02-01 13:03, 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;
>> 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).
>> So, could that be some bug with correct dealing of long values in the
>> multiplex creation (btw. where is that happening?) 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.
>> ------------------------------------------------------------------------------
>> 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
> --
> Sjoerd Mullender

More information about the developers-list mailing list