Changeset: 65e680587c65 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=65e680587c65 Added Files: monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows.single Modified Files: clients/mapiclient/eventparser.c clients/mapiclient/tachograph.c Branch: resultset Log Message:
Merge with default branch. diffs (truncated from 415 to 300 lines): diff --git a/clients/mapiclient/eventparser.c b/clients/mapiclient/eventparser.c --- a/clients/mapiclient/eventparser.c +++ b/clients/mapiclient/eventparser.c @@ -53,7 +53,7 @@ parseArguments(char *call, int m) if( debug) fprintf(stderr,"%s\n",call); - // also skip keywords + // skip MAL keywords if( strncmp(c,"function ",10) == 0 ) c +=10; if( strncmp(c,"end ",4) == 0 ) c +=4; if( strncmp(c,"barrier ",8) == 0 ) c +=8; @@ -68,13 +68,14 @@ parseArguments(char *call, int m) if (*c !=')') for( ; c && *c && malargc < MAXMALARGS; c++){ if(isalpha((int)*c) && strncmp(c,"nil",3) && strncmp(c,"true",4) && strncmp(c,"false",5) ){ - // remember variable in its own structure, it ends with := + // remember variable in its own structure, it ends with = v= c; c= strchr(c,'='); if( c == 0) break; *c = 0; malvariables[malvartop++] = strdup(v); + *c = '='; c++; } // all arguments have a value @@ -128,7 +129,8 @@ parseArguments(char *call, int m) *c = ch; if( ch == ';') break; } else malargc++; - if( *c == '{') { + + if( *c == '{') { // skip property lists while(*c && *c != '}') c++; c++; } @@ -142,6 +144,7 @@ parseArguments(char *call, int m) fprintf(stderr,"var[%d] %s\n",i,malvariables[i]); } } + int eventparser(char *row, EventRecord *ev) { diff --git a/clients/mapiclient/tachograph.c b/clients/mapiclient/tachograph.c --- a/clients/mapiclient/tachograph.c +++ b/clients/mapiclient/tachograph.c @@ -98,7 +98,7 @@ Source *sources; // original column name int srctop, srcmax; static void -addSource(char *varname, char *tbl, char *col) +addSource(char *varname, char *sch, char *tbl, char *col) { char buf[BUFSIZ]; @@ -111,7 +111,7 @@ addSource(char *varname, char *tbl, char } assert(sources); sources[srctop].varname = strdup(varname); - snprintf(buf,BUFSIZ,"%s%s%s",tbl,(col?".":""),col?col:""); + snprintf(buf,BUFSIZ,"%s%s%s%s%s", (strcmp(sch,"sys")== 0? "": sch), (strcmp(sch,"sys")== 0? "": "."), tbl,(col?".":""),col?col:""); sources[srctop].source = strdup(buf); //fprintf(stderr,"addSource %s at %d %s\n",varname, srctop, buf); srctop++; @@ -136,7 +136,6 @@ addSourcePair(char *varname, char *name) if( strcmp(name, sources[i].varname)==0){ sources[srctop].varname = strdup(varname); sources[srctop].source = strdup(sources[i].source); - //fprintf(stderr,"addSourcePair %s %s\n",varname,sources[i].source); srctop++; return; } @@ -291,9 +290,9 @@ static struct{ {"algebra.subselect", 17, "select",6, 0}, {"sql.projectdelta", 16, "project",7, 0}, {"algebra.subjoin", 15, "join",4, 0}, - {"language.pass(nil)", 18, "pass", 4, 0}, + {"language.pass(nil)", 18, "release", 7, 0}, {"mat.packIncrement", 17, "pack",4, 0}, - {"language.pass", 13, "pass", 4, 0}, + {"language.pass", 13, "release", 7, 0}, {"aggr.subcount", 13, "count", 5, 0}, {"sql.subdelta", 12, "project",7, 0}, {"bat.append", 10, "append", 6, 0}, @@ -319,49 +318,76 @@ static struct{ {0,0,0,0,0}}; static void -renderArgs(char *c, int len, char *line, char *limit, char *l) +renderArgs(char *c, char *l, int len) { char varname[BUFSIZ]={0}, *v=0; - for(; *c && *c !=')' && l < limit-1; ){ - if( *c == ',')*l++= *c++; - v= 0; + char *limit = l + len-1; + int i; + + // we always start at a parameter list + for(; *c && *c !=')' && l < limit; ){ + varname[0] = 0; + if( *c == ',')*l++ = *c++; + // take out the variable name if(isalpha((int)*c) || *c == '_' ){ - v= varname; - while(*c && (isalnum((int)*c) || *c=='_')) *v++ = *c++; - *v=0; + for( i = 0; i < BUFSIZ-1 && *c && (isalnum((int)*c) || *c=='_') ; i++) + varname[i] = *c++; + varname[i]=0; } + // handle value part if( *c == '=') c++; + // BAT result if( *c == '<'){ while(*c && *c !='>') c++; if(*c) c++; - if (v && varname[0]){ + if (varname[0]){ v= fndSource(varname); - snprintf(l, len -strlen(line)-2,"%s",v); - while(*l) l++; + l+= snprintf(l, limit - l-2,"%s",v); free(v); } + // copy the count while(*c && *c !=']' && l < limit -2) *l++ = *c++; while(*c && *c != ']') c++; if( *c == ']' ) *l++ = *c++; - } + while(*c && *c != ':') c++; + } else + // string constant if (*c == '"' ) { *l++ = *c++; while(*c && *c !='"' && *(c-1) !='\\' && l < limit-2 ) *l++ =*c++; while(*c && *c !='"') c++; } else{ + // all else while(*c && *c !=':' && *c !=',' && l < limit-2) *l++ = *c++; while(*c && *c !=':' && *c !=',' ) c++; } + // skip type descriptor if (*c == ':'){ if( strncmp(c,":bat",4)== 0){ while(*c && *c !=']') c++; if( *c == ']') c++; - } else - while(*c && *c != ',' && *c != ')') c++; + } + while(*c && *c != ',' && *c != '{' && *c != ')') c++; } - // literals + + // copy the literals if( strcmp(varname,"nil") == 0 || strcmp(varname,"true")==0 || strcmp(varname,"false")==0) for(v = varname; *v; ) *l++ = *v++; +/* + else + // show variable in assignment only + if (v && varname[0] && strstr(c,":=") && !strchr(c,')') ){ + v= fndSource(varname); + snprintf(l, len -strlen(line)-2,"%s",v); + while(*l) l++; + free(v); + } +*/ + // drop the properties + if( *c == '{'){ + while(*c && *c !='}') c++; + if(*c) c++; + } } if(*c) *l++ = *c; *l=0; @@ -374,19 +400,39 @@ renderCall(char *line, int len, char *st int i; (void) state; + // skip MAL keywords + if( strncmp(c,"function ",10) == 0 ) { + while( *c && l < limit -1) *l++ = *c++; + *l = 0; + return; + } + if( strncmp(c,"end ",4) == 0 ) { + while( *c && l < limit -1) *l++ = *c++; + *l = 0; + return; + } + if( strncmp(c,"barrier ",8) == 0 ) c +=8; + if( strncmp(c,"redo ",5) == 0 ) c +=5; + if( strncmp(c,"leave ",6) == 0 ) c +=6; + if( strncmp(c,"return ",7) == 0 ) c +=7; + if( strncmp(c,"yield ",6) == 0 ) c +=6; + if( strncmp(c,"catch ",6) == 0 ) c +=6; + if( strncmp(c,"raise ",6) == 0 ) c +=6; + stmt = c; // look for assignment c = strstr(c," :="); if( c) { if(state){ - // for finished instructions show the result too + // for finished instructions show the result targets too *c =0; s = stmt; while(*s && isspace((int) *s)) s++; if( *s == '(') *l++ = *s++; - renderArgs(s, len, line, limit, l); + renderArgs(s, l, limit - l); while(*l) l++; sprintf(l," := "); while(*l) l++; + *c=' '; } c+=3; } else c=stmt; @@ -402,12 +448,15 @@ renderCall(char *line, int len, char *st *l=0; break; } - while(*c && *c !='(') *l++= *c++; - } else - while(*c && *c !='(') *l++= *c++; + if( strchr(c,'(') ) + while(*c && *c !='(') *l++= *c++; + } else{ + if( strchr(c,'(') ) + while(*c && *c !='(') *l++= *c++; + } // handle argument list if( *c == '(') *l++ = *c++; - renderArgs(c, len, line, limit, l); + renderArgs(c, l, limit- l); } static void @@ -640,42 +689,30 @@ update(EventRecord *ev) // keep track of sources, pick first variable only // We should use the MAL semantics to pick to proper heritage path if ( strstr(ev->stmt,"sql.tid") && *ev->stmt != '('){ - char nme[BUFSIZ],*n=nme, *s= ev->stmt; - while(*s && *s != '=') *n++ = *s++; - *n = 0; - addSource(nme, malarguments[malretc + 2], ""); + addSource(malvariables[0], malarguments[malretc + 1], malarguments[malretc + 2], 0); } else if ( strstr(ev->stmt,"sql.bind") && *ev->stmt != '('){ - char nme[BUFSIZ],*n=nme, *s= ev->stmt; - while(*s && *s != '=') *n++ = *s++; - *n = 0; - addSource(nme, malarguments[malretc + 2], malarguments[malretc + 3]); + addSource(malvariables[0], malarguments[malretc + 1], malarguments[malretc + 2], malarguments[malretc + 3]); + } else + if ( strstr(ev->stmt,"sql.bind") && *ev->stmt == '('){ + addSource(malvariables[0], malarguments[malretc + 1], malarguments[malretc + 2], 0); + addSource(malvariables[1], malarguments[malretc + 1], malarguments[malretc + 2], malarguments[malretc + 3]); } else if ( strstr(ev->stmt,"sql.projectdelta") && *ev->stmt != '(' ){ - char nme[BUFSIZ],*n=nme, *s= ev->stmt; - while(*s && *s != '=') *n++ = *s++; - *n = 0; - addSourcePair(nme, malvariables[1]); + addSourcePair(malvariables[0], malvariables[1]); } else if ( strstr(ev->stmt,"algebra.leftfetchjoin") && *ev->stmt != '(' ){ - char nme[BUFSIZ],*n=nme, *s= ev->stmt; - while(*s && *s != '=') *n++ = *s++; - *n = 0; - addSourcePair(nme, malvariables[malvartop-1]); + addSourcePair(malvariables[0], malvariables[malvartop - 1]); } else if ( strstr(ev->stmt,"algebra.subjoin") && *ev->stmt != '(' ){ - char nme[BUFSIZ],*n=nme, *s= ev->stmt; - while(*s && *s != '=') *n++ = *s++; - *n = 0; - addSourcePair(nme, malvariables[malvartop-1]); - } else { - char nme[BUFSIZ],*n=nme, *s= ev->stmt; - if( *s =='(') s++; - while(*s && *s != '=') *n++ = *s++; - *n = 0; + addSourcePair(malvariables[0], malvariables[malvartop - 1]); + } else + if ( malvariables[0] ){ // update the source direction - for( i=0; i< malvartop;i++) - addSourcePair(nme,malvariables[i]); + char *v= fndSource(malvariables[0]); + //for( i=malretc; i< malvartop;i++) + addSourcePair(v, malvariables[malretc]); + free(v); } fprintf(tachojson,"{\n"); fprintf(tachojson,"\"qid\":\"%s\",\n",currentfunction?currentfunction:""); diff --git a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows.single b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out.Windows.single new file mode 100755 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list