Changeset: dddc13ded22c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=dddc13ded22c
Modified Files:
        monetdb5/modules/mal/manifold.c
        sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.sql
        sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
Branch: Oct2014
Log Message:

Dealing with void headed columns
The void is converted to an oid based on the tseqbase.
The outer iterator is based on a simple forloop, avoiding
pointer arithmetic with size= 0


diffs (261 lines):

diff --git a/monetdb5/modules/mal/manifold.c b/monetdb5/modules/mal/manifold.c
--- a/monetdb5/modules/mal/manifold.c
+++ b/monetdb5/modules/mal/manifold.c
@@ -47,6 +47,7 @@ typedef struct{
        void *last;
        int     size;
        int type;
+       BUN cnt;
        BATiter bi;
        BUN  o;
        BUN  q;
@@ -67,12 +68,15 @@ typedef struct{
 // keep the last error message received
 #define ManifoldLoop(Type, ...) {                      \
        Type *v = (Type*) mut->args[0].first;           \
-       for( ; p<q ; p += mut->args[mut->fvar].size){   \
+       oid oo, olimit = mut->args[mut->fvar].cnt; \
+       for( oo= 0; oo < olimit; oo++){\
                msg = (*mut->pci->fcn)(v, __VA_ARGS__); \
-               if (msg)                                \
-                       break;                          \
+               if (msg) break;                         \
                for( i = mut->fvar; i<= mut->lvar; i++) {       \
-                       if(ATOMstorage(mut->args[i].type) < TYPE_str){  \
+                       if(ATOMstorage(mut->args[i].type == TYPE_void) ){       
\
+                               args[i] = (void*)  &mut->args[i].o;      \
+                               mut->args[i].o++;               \
+                       } else if(ATOMstorage(mut->args[i].type) < TYPE_str ) { 
\
                                args[i] += mut->args[i].size;   \
                        } else if (ATOMvarsized(mut->args[i].type)) { \
                                mut->args[i].o++;               \
@@ -100,13 +104,17 @@ case TYPE_flt: ManifoldLoop(flt,__VA_ARG
 case TYPE_dbl: ManifoldLoop(dbl,__VA_ARGS__); break;\
 case TYPE_str: \
 default:\
-       for( ; p< q ; p += mut->args[mut->fvar].size){          \
+{   oid oo, olimit = mut->args[mut->fvar].cnt; \
+       for( oo= 0; oo < olimit; oo++){\
                msg = (*mut->pci->fcn)(&y, __VA_ARGS__);        \
                if (msg)                                        \
                        break;                                  \
                bunfastapp(mut->args[0].b, (void*) y);  \
                for( i = mut->fvar; i<= mut->lvar; i++) {       \
-                       if(ATOMstorage(mut->args[i].type) < TYPE_str){  \
+                       if(ATOMstorage(mut->args[i].type == TYPE_void) ){       
\
+                               args[i] = (void*)  &mut->args[i].o;      \
+                               mut->args[i].o++;               \
+                       } else if(ATOMstorage(mut->args[i].type) < TYPE_str){   
\
                                args[i] += mut->args[i].size;   \
                        } else if(ATOMvarsized(mut->args[i].type)){     \
                                mut->args[i].o++;               \
@@ -119,7 +127,7 @@ default:\
                        }                                       \
                }                                               \
        }                                                       \
-}
+} }
 
 // single argument is preparatory step for GDK_mapreduce
 // Only the last error message is returned, the value of
@@ -127,7 +135,6 @@ default:\
 static str
 MANIFOLDjob(MULTItask *mut)
 {      int i;
-       char *p, *q;
        char **args;
        str y = NULL, msg= MAL_SUCCEED;
 
@@ -138,9 +145,9 @@ MANIFOLDjob(MULTItask *mut)
        // the mod.fcn arguments are ignored from the call
        for( i = mut->pci->retc+2; i< mut->pci->argc; i++) {
                if ( mut->args[i].b ){
-                       if(ATOMstorage(mut->args[i].type) < TYPE_str){  \
+                       if(ATOMstorage(mut->args[i].type) < TYPE_str){  
                                args[i] = (char*) mut->args[i].first;
-                       } else if(ATOMvarsized(mut->args[i].type)){     \
+                       } else if(ATOMvarsized(mut->args[i].type)){     
                                mut->args[i].s = (str*) 
BUNtail(mut->args[i].bi, mut->args[i].o);
                                args[i] =  (void*) & mut->args[i].s; 
                        } else {
@@ -155,8 +162,6 @@ MANIFOLDjob(MULTItask *mut)
 #ifdef _DEBUG_MANIFOLD_
        mnstr_printf(mut->cntxt->fdout,"#MANIFOLDjob fvar %d lvar %d type 
%d\n",mut->fvar,mut->lvar, ATOMstorage(mut->args[mut->fvar].b->ttype));
 #endif
-       p = (char*)  mut->args[mut->fvar].first;
-       q = (char*)  mut->args[mut->fvar].last;
        // use limited argument list expansion.
        switch(mut->pci->argc){
        case 4: Manifoldbody(args[3]); break;
@@ -202,7 +207,7 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
                        tpe =getColumnType(getArgType(mb,pci,i));
                        break;
                }
-       if( tpe == TYPE_any || tpe == TYPE_void){
+       if( tpe == TYPE_any ){
                freeMalBlk(nmb);
                return NULL;
        }
@@ -215,10 +220,6 @@ MANIFOLDtypecheck(Client cntxt, MalBlkPt
        // extract their scalar argument type
        for ( i = pci->retc+2; i < pci->argc; i++){
                tpe = getColumnType(getArgType(mb,pci,i));
-               if( tpe == TYPE_any || tpe == TYPE_void){
-                       freeMalBlk(nmb);
-                       return NULL;
-               }
                q= pushArgument(nmb,q, k= newTmpVariable(nmb, tpe));
                setVarFixed(nmb,k);
                setVarUDFtype(nmb,k);
@@ -253,6 +254,7 @@ MANIFOLDevaluate(Client cntxt, MalBlkPtr
        MULTIarg *mat;
        int i, tpe= 0;
        BUN cnt = 0;
+       oid o = 0;
        str msg = MAL_SUCCEED;
        MALfcn fcn;
 
@@ -293,8 +295,14 @@ MANIFOLDevaluate(Client cntxt, MalBlkPtr
                                mat[i].size = Tsize(mat[i].b);
                        else
                                mat[i].size = BATatoms[ATOMstorage(tpe)].size;
-                       mat[i].first = (void*)  Tloc(mat[i].b, 
BUNfirst(mat[i].b));
-                       mat[i].last = (void*) Tloc(mat[i].b, BUNlast(mat[i].b));
+                       mat[i].cnt = cnt;
+                       if ( mat[i].b->ttype == TYPE_void){
+                               o = mat[i].b->tseqbase;
+                               mat[i].first = mat[i].last = (void*) &o;
+                       } else {
+                               mat[i].first = (void*)  Tloc(mat[i].b, 
BUNfirst(mat[i].b));
+                               mat[i].last = (void*) Tloc(mat[i].b, 
BUNlast(mat[i].b));
+                       }
                        mat[i].bi = bat_iterator(mat[i].b);
                        mat[i].o = BUNfirst(mat[i].b);
                        mat[i].q = BUNlast(mat[i].b);
@@ -350,8 +358,7 @@ wrapup:
 }
 
 // The old code
-str
-MANIFOLDremapMultiplex(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p){
+str MANIFOLDremapMultiplex(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
p){
     char buf[BUFSIZ];
     (void) mb;
     (void) cntxt;
diff --git a/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.sql 
b/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.sql
--- a/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.sql
+++ b/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.sql
@@ -1,4 +1,6 @@
 create table foo_nil_2dec (t timestamp,v decimal(18,9));
-insert into foo_nil_2dec values (now(),42);
-insert into foo_nil_2dec values (now(),43);
+insert into foo_nil_2dec values (timestamp '2014-10-05',42);
+insert into foo_nil_2dec values (timestamp '2014-10-05',43);
 select (t-(select timestamp '1970-1-1')),v from foo_nil_2dec union all select 
(t-(select timestamp '1970-1-1')),null from foo_nil_2dec;
+
+explain select (t-(select timestamp '1970-1-1')),v from foo_nil_2dec union all 
select (t-(select timestamp '1970-1-1')),null from foo_nil_2dec;
diff --git a/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out 
b/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
--- a/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
+++ b/sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
@@ -35,10 +35,97 @@ Ready.
 % L2,  v # name
 % bigint,      decimal # type
 % 13,  20 # length
-[ 1412531985000,       42.000000000    ]
-[ 1412531985000,       43.000000000    ]
-[ 1412531985000,       NULL    ]
-[ 1412531985000,       NULL    ]
+[ 1412467200000,       42.000000000    ]
+[ 1412467200000,       43.000000000    ]
+[ 1412467200000,       NULL    ]
+[ 1412467200000,       NULL    ]
+#explain select (t-(select timestamp '1970-1-1')),v from foo_nil_2dec union 
all select (t-(select timestamp '1970-1-1')),null from foo_nil_2dec;
+% .explain # table_name
+% mal # name
+% clob # type
+% 187 # length
+function user.s5_1{autoCommit=true}(A0:timestamp,A1:timestamp,A2:void):void;
+barrier X_115 := language.dataflow();
+    X_6:bat[:oid,:lng]  := bat.new(nil:oid,nil:lng);
+    X_5 := sql.mvc();
+    X_67:bat[:oid,:oid]  := sql.tid(X_5,"sys","foo_nil_2dec",0,2);
+    X_70:bat[:oid,:timestamp]  := sql.bind(X_5,"sys","foo_nil_2dec","t",0,0,2);
+    (X_72:bat[:oid,:oid] ,X_73:bat[:oid,:timestamp] ) := 
sql.bind(X_5,"sys","foo_nil_2dec","t",2,0,2);
+    X_82 := sql.delta(X_70,X_72,X_73);
+    X_84 := algebra.leftfetchjoin(X_67,X_82);
+    X_16 := calc.timestamp(A0,7);
+    X_86 := algebra.project(X_84,X_16);
+    X_88 := batmtime.diff(X_84,X_86);
+    X_69:bat[:oid,:oid]  := sql.tid(X_5,"sys","foo_nil_2dec",1,2);
+    X_71:bat[:oid,:timestamp]  := sql.bind(X_5,"sys","foo_nil_2dec","t",0,1,2);
+    (X_74:bat[:oid,:oid] ,X_75:bat[:oid,:timestamp] ) := 
sql.bind(X_5,"sys","foo_nil_2dec","t",2,1,2);
+    X_14:bat[:oid,:timestamp]  := sql.bind(X_5,"sys","foo_nil_2dec","t",1);
+    X_83 := sql.delta(X_71,X_74,X_75,X_14);
+    X_85 := algebra.leftfetchjoin(X_69,X_83);
+    X_87 := algebra.project(X_85,X_16);
+    X_89 := batmtime.diff(X_85,X_87);
+    X_104 := mat.packIncrement(X_88,2);
+    X_18:bat[:oid,:lng]  := mat.packIncrement(X_104,X_89);
+    X_19 := bat.append(X_6,X_18,true);
+    X_20 := calc.timestamp(A1,7);
+    X_92 := algebra.project(X_84,X_20);
+    X_94 := batmtime.diff(X_84,X_92);
+    X_93 := algebra.project(X_85,X_20);
+    X_95 := batmtime.diff(X_85,X_93);
+    X_106 := mat.packIncrement(X_94,2);
+    X_21:bat[:oid,:lng]  := mat.packIncrement(X_106,X_95);
+    X_22 := bat.append(X_19,X_21,true);
+    X_24:bat[:oid,:lng]  := bat.new(nil:oid,nil:lng);
+    X_76:bat[:oid,:lng]  := sql.bind(X_5,"sys","foo_nil_2dec","v",0,0,2);
+    (X_78:bat[:oid,:oid] ,X_79:bat[:oid,:lng] ) := 
sql.bind(X_5,"sys","foo_nil_2dec","v",2,0,2);
+    X_96 := sql.delta(X_76,X_78,X_79);
+    X_98 := algebra.leftfetchjoin(X_67,X_96);
+    X_77:bat[:oid,:lng]  := sql.bind(X_5,"sys","foo_nil_2dec","v",0,1,2);
+    (X_80:bat[:oid,:oid] ,X_81:bat[:oid,:lng] ) := 
sql.bind(X_5,"sys","foo_nil_2dec","v",2,1,2);
+    X_32:bat[:oid,:lng]  := sql.bind(X_5,"sys","foo_nil_2dec","v",1);
+    X_97 := sql.delta(X_77,X_80,X_81,X_32);
+    X_99 := algebra.leftfetchjoin(X_69,X_97);
+    X_108 := mat.packIncrement(X_98,2);
+    X_34 := mat.packIncrement(X_108,X_99);
+    X_35 := bat.append(X_24,X_34,true);
+    X_100:bat[:oid,:void]  := algebra.project(X_84,A2);
+    language.pass(X_67);
+    language.pass(X_69);
+    language.pass(X_84);
+exit X_115;
+    X_118:bat[:void,:oid]  := bat.reverse(X_100);
+    X_120 := bat.new(nil:oid,nil:lng);
+barrier (X_124,X_125) := iterator.new(X_100);
+    X_127 := calc.lng(X_125,18,9);
+    X_128 := algebra.fetch(X_118,X_124);
+    bat.insert(X_120,X_128,X_127);
+    redo (X_124,X_125) := iterator.next(X_100);
+exit (X_124,X_125);
+    X_100:bat[:oid,:void]  := nil:bat[:oid,:void];
+    X_118:bat[:void,:oid]  := nil:bat[:void,:oid];
+    X_102 := X_120;
+    X_101:bat[:oid,:void]  := algebra.project(X_85,A2);
+    X_134:bat[:void,:oid]  := bat.reverse(X_101);
+    X_136 := bat.new(nil:oid,nil:lng);
+barrier (X_138,X_139) := iterator.new(X_101);
+    X_141 := calc.lng(X_139,18,9);
+    X_142 := algebra.fetch(X_134,X_138);
+    bat.insert(X_136,X_142,X_141);
+    redo (X_138,X_139) := iterator.next(X_101);
+exit (X_138,X_139);
+    X_101:bat[:oid,:void]  := nil:bat[:oid,:void];
+    X_134:bat[:void,:oid]  := nil:bat[:void,:oid];
+    X_103 := X_136;
+    X_110 := mat.packIncrement(X_102,2);
+    X_36:bat[:oid,:lng]  := mat.packIncrement(X_110,X_103);
+    X_41 := bat.append(X_35,X_36,true);
+    X_42 := sql.resultSet(2,1,X_22);
+    sql.rsColumn(X_42,".L5","L2","bigint",64,0,X_22);
+    sql.rsColumn(X_42,".L5","v","decimal",18,9,X_41);
+    X_50 := io.stdout();
+    sql.exportResult(X_50,X_42);
+end s5_1;
+# querylog.define("explain select (t-(select timestamp \\'1970-1-1\\')),v from 
foo_nil_2dec union all select (t-(select timestamp \\'1970-1-1\\')),null from 
foo_nil_2dec;","default_pipe")
 
 # 23:28:04 >  
 # 23:28:04 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to