Changeset: 403b22e4038d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=403b22e4038d
Modified Files:
        sql/backends/monet5/generator/generator.c
Branch: generator
Log Message:

Fine tune the generator boundary tests


diffs (181 lines):

diff --git a/sql/backends/monet5/generator/generator.c 
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -179,7 +179,7 @@ VLTgenerator_noop(Client cntxt, MalBlkPt
                s = pci->argc == 3 ? 1 : *(TPE*) getArgReference(stk, pci, 3); \
                if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || f == 
TPE##_nil || l == TPE##_nil)\
                        throw(MAL, "generator.table",                   \
-                             "Illegal generator arguments");           \
+                             "Illegal generator range");               \
                n = (BUN) ((l - f) / s);                                \
                if ((TPE) (n * s + f) != l)                             \
                        n++;                                            \
@@ -238,7 +238,7 @@ VLTgenerator_table(Client cntxt, MalBlkP
                        if (VARcalccmp(&ret, &stk->stk[pci->argv[1]],
                                       &stk->stk[pci->argv[2]]) == GDK_FAIL)
                                throw(MAL, "generator.table",
-                                     "Illegal generator expression arguments");
+                                     "Illegal generator expression range");
                        f = *(timestamp *) getArgReference(stk, pci, 1);
                        l = *(timestamp *) getArgReference(stk, pci, 2);
                        s = *(lng *) getArgReference(stk, pci, 3);
@@ -247,7 +247,7 @@ VLTgenerator_table(Client cntxt, MalBlkP
                            (s < 0 && ret.val.btval < 0) ||
                                timestamp_isnil(f) || timestamp_isnil(l))
                                throw(MAL, "generator.table",
-                                     "Illegal generator arguments");
+                                     "Illegal generator range");
                        /* casting one value to lng causes the whole
                         * computation to be done as lng, reducing the
                         * risk of overflow */
@@ -317,7 +317,7 @@ findLastAssign(MalBlkPtr mb, InstrPtr pc
                s = p->argc == 3 ? 1 : * (TPE *) getArgReference(stk, p, 3); \
                if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) || f == 
TPE##_nil || l == TPE##_nil) \
                        throw(MAL, "generator.subselect",               \
-                             "Illegal generator arguments");           \
+                             "Illegal generator range");               \
                n = (BUN) (((TPE2) l - (TPE2) f) / (TPE2) s);           \
                if ((TPE)(n * s + f) != l)                              \
                        n++;                                            \
@@ -432,9 +432,12 @@ VLTgenerator_subselect(Client cntxt, Mal
                        tsf = *(timestamp *) getArgReference(stk, p, 1);
                        tsl = *(timestamp *) getArgReference(stk, p, 2);
                        tss = *(lng *) getArgReference(stk, p, 3);
-                       if ( tss == 0 ||
-                               timestamp_isnil(tsf) || timestamp_isnil(tsl))
-                               throw(MAL, "generator.subselect", "Illegal 
generator arguments");
+                       if ( tss == 0 || 
+                               timestamp_isnil(tsf) || timestamp_isnil(tsl) ||
+                                (tss > 0 && (tsf.days > tsl.days || (tsf.days 
== tsl.days && tsf.msecs > tsl.msecs) )) ||
+                                (tss < 0 && (tsf.days < tsl.days || (tsf.days 
== tsl.days && tsf.msecs < tsl.msecs) )) 
+                               )
+                               throw(MAL, "generator.subselect", "Illegal 
generator range");
 
                        tlow = *(timestamp*) getArgReference(stk,pci,i);
                        thgh = *(timestamp*) getArgReference(stk,pci,i+1);
@@ -457,6 +460,7 @@ VLTgenerator_subselect(Client cntxt, Mal
                        bn = BATnew(TYPE_void, TYPE_oid, o2 + 1, TRANSIENT);
                        if (bn == NULL)
                                throw(MAL, "generator.subselect", 
MAL_MALLOC_FAIL);
+                       BATseqbase(bn,0);\
 
                        // simply enumerate the sequence and filter it by 
predicate and candidate list
                        ol = (oid *) Tloc(bn, BUNfirst(bn));
@@ -607,6 +611,7 @@ float nextafterf(float x, float y);
        bn = BATnew(TYPE_void, TYPE_oid, cap, TRANSIENT);\
        if( bn == NULL)\
                throw(MAL,"generator.thetasubselect",MAL_MALLOC_FAIL);\
+       BATseqbase(bn,0);\
        low= hgh = TPE##_nil;\
        v = (oid*) Tloc(bn,BUNfirst(bn));\
        if ( strcmp(oper,"<") == 0){\
@@ -635,8 +640,8 @@ float nextafterf(float x, float y);
        for(j=0;j<cap;j++, f+=s, o++)\
                if( ((low == TPE##_nil || f >= low) && (f <= hgh || hgh == 
TPE##_nil)) || anti){\
                        if(cand){ \
-                               if( cl){ while(cn-- > 0 && *cl < o) cl++; if ( 
*cl == o){ *v++= o; c++;}} \
-                               else { while(cn-- > 0 && oc < o) oc++; if ( oc 
== o){ *v++= o; c++;} }\
+                               if( cl){ while(cn-- >= 0 && *cl < o) cl++; if ( 
*cl == o){ *v++= o; c++;}} \
+                               else { while(cn-- >= 0 && oc < o) oc++; if ( oc 
== o){ *v++= o; c++;} }\
                        } else {*v++ = o; c++;}\
                } \
 }
@@ -646,7 +651,7 @@ str VLTgenerator_thetasubselect(Client c
 {
        int idx, cndid =0, c= 0, anti =0,tpe;
        BAT *cand = 0, *bn = NULL;
-       BUN cap;
+       BUN cap,j;
        lng cn= 0;
        oid o = 0, oc = 0,  *cl = 0;
        InstrPtr p;
@@ -681,22 +686,20 @@ str VLTgenerator_thetasubselect(Client c
        break;
        default:
                if ( tpe == TYPE_timestamp){
-                       timestamp f,l, low, hgh;
+                       timestamp f,l, val, low, hgh;
                        lng  s;
                        oid *v;
 
                        f = *(timestamp*) getArgReference(stk,p, 1);
                        l = *(timestamp*) getArgReference(stk,p, 2);
                        s = *(lng*) getArgReference(stk,p, 3);
-                       hgh = low = *(timestamp*) getArgReference(stk,pci, idx);
+                       if ( s == 0 || 
+                                (s > 0 && (f.days > l.days || (f.days == 
l.days && f.msecs > l.msecs) )) ||
+                                (s < 0 && (f.days < l.days || (f.days == 
l.days && f.msecs < l.msecs) )) 
+                               )
+                               throw(MAL, "generator.subselect", "Illegal 
generator range");
 
-                       if ( s == 0 || timestamp_isnil(f) || timestamp_isnil(l))
-                               throw(MAL, "generator.subselect", "Illegal 
generator arguments");
-                       if( timestamp_isnil(low) )
-                               low = f;
-                       if( timestamp_isnil(hgh))
-                               hgh = l;
-
+                       hgh = low = *timestamp_nil;
                        if ( strcmp(oper,"<") == 0){
                                hgh= *(timestamp*) getArgReference(stk,pci,idx);
                        } else
@@ -723,33 +726,21 @@ str VLTgenerator_thetasubselect(Client c
                        if( bn == NULL)
                                
throw(MAL,"generator.thetasubselect",MAL_MALLOC_FAIL);
                        v = (oid*) Tloc(bn,BUNfirst(bn));
+                       BATseqbase(bn,0);
 
                        if(cand){ cn = BATcount(cand); if( cl == 0) oc = 
cand->tseqbase; }
-                       if( (f.days < l.days || (f.days = l.days && f.msecs 
<l.msecs)) && s > 0){
-                               for(; f.days<l.days || (f.days == l.days && 
f.msecs <l.msecs); o++){
-                                       if( (f.days<hgh.days|| (f.days== 
hgh.days && f.msecs < hgh.msecs))  || timestamp_isnil(hgh) || anti){
-                                               if(cand){
-                                                       if( cl){ while(cn-- > 0 
&& *cl < o) cl++; if ( *cl == o){ *v++= o; c++;}}
-                                                       else { while(cn-- > 0 
&& oc < o) oc++; if ( oc == o){ *v++= o; c++;} }
-                                               } else {*v++ = o; c++;}
-                                       }
-                                       if( (msg = MTIMEtimestamp_add(&f, &f, 
&s)) != MAL_SUCCEED)
-                                               goto wrapup;
+                       val = f;
+                       for(j = 0; j<= cap; j++,  o++){
+                               if( (( timestamp_isnil(low) || (val.days > 
low.days || (val.days == low.days && val.msecs >=low.msecs))) && 
+                                        ( timestamp_isnil(hgh) || (val.days < 
hgh.days || (val.days == hgh.days && val.msecs <= hgh.msecs)))) || anti){
+                                       if(cand){
+                                               if( cl){ while(cn-- >= 0 && *cl 
< o) cl++; if ( *cl == o){ *v++= o; c++;}}
+                                               else { while(cn-- >= 0 && oc < 
o) oc++; if ( oc == o){ *v++= o; c++;} }
+                                       } else {*v++ = o; c++;}
                                }
-                       } else 
-                       if( (f.days > l.days || (f.days = l.days && f.msecs 
>l.msecs)) && s < 0){
-                               for(; f.days>l.days || (f.days == l.days && 
f.msecs >l.msecs); o++){
-                                       if( (f.days<hgh.days|| (f.days== 
hgh.days && f.msecs < hgh.msecs))  || timestamp_isnil(hgh) || anti){
-                                               if(cand){
-                                                       if( cl){ while(cn-- > 0 
&& *cl < o) cl++; if ( *cl == o){ *v++= o; c++;}}
-                                                       else { while(cn-- > 0 
&& oc < o) oc++; if ( oc == o){ *v++= o; c++;} }
-                                               } else {*v++ = o; c++;}
-                                       }
-                                       if( (msg = MTIMEtimestamp_add(&f, &f, 
&s)) != MAL_SUCCEED)
-                                               goto wrapup;
-                               }
-                       } else
-                               throw(MAL,"generator.thetasubselect","Illegal 
generator arguments");
+                               if( (msg = MTIMEtimestamp_add(&val, &val, &s)) 
!= MAL_SUCCEED)
+                                       goto wrapup;
+                       }
                } else
                        throw(MAL,"generator.thetasubselect","Illegal generator 
arguments");
        }
@@ -849,9 +840,11 @@ str VLTgenerator_leftfetchjoin(Client cn
                                if( (msg = MTIMEtimestamp_add(&val, &f, &t)) != 
MAL_SUCCEED)
                                        return msg;
 
-                               if (s > 0 && ((val.days < f.days || (val.days 
== f.days && val.msecs < f.msecs)) || ((val.days>l.days || (val.days== l.days 
&& val.msecs >= l.msecs)))  || timestamp_isnil(val)) )
+                               if ( timestamp_isnil(val))
                                        continue;
-                               if (s < 0 && ((val.days < l.days || (val.days 
== l.days && val.msecs < l.msecs)) || ((val.days>f.days || (val.days== f.days 
&& val.msecs >= f.msecs)))  || timestamp_isnil(val)) )
+                               if (s > 0 && ((val.days < f.days || (val.days 
== f.days && val.msecs < f.msecs)) || ((val.days>l.days || (val.days== l.days 
&& val.msecs >= l.msecs)))  ) )
+                                       continue;
+                               if (s < 0 && ((val.days < l.days || (val.days 
== l.days && val.msecs < l.msecs)) || ((val.days>f.days || (val.days== f.days 
&& val.msecs >= f.msecs)))  ) )
                                        continue;
                                *v++ = val;
                                c++;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to