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

Stefan Manegold Stefan.Manegold at cwi.nl
Sun Feb 1 14:38:12 CET 2009


On Sun, Feb 01, 2009 at 02:15:06PM +0100, Lefteris wrote:
> 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:)

If I recall correcly, printing of a BAT first samples some values and
converts the to str (*_tostr()) to estimate the column width for ome "nice"
rendering, and then calls *_tostr() for all values to do the actual printing
--- in you case with only one tuple in the BAT, this one is obviously
randomly chosen by sampling ... ;-)

... it is usually indeed no good idea to use no non-local memory location
as/like a local varible in a function --- unless the side effects are
required and intended ... ;-)

Stefan

> I fixed it by indeed copying val to some temp variable.
> 
> Thank you very much.
> 
> lefteris
> 
> 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
> >
> 
> ------------------------------------------------------------------------------
> 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