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