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

Reply via email to