Changeset: eeff2dfd939d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=eeff2dfd939d
Modified Files:
        monetdb5/mal/mal_function.c
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_parser.c
        monetdb5/mal/mal_resolve.c
        monetdb5/mal/mal_resolve.h
        monetdb5/mal/mal_session.c
        monetdb5/modules/mal/manifold.c
        monetdb5/optimizer/opt_coercion.c
        monetdb5/optimizer/opt_generator.c
        monetdb5/optimizer/opt_matpack.c
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_remap.c
        sql/backends/monet5/sql_aggr_bte.mal
        sql/backends/monet5/sql_aggr_flt.mal
        sql/backends/monet5/sql_aggr_int.mal
        sql/backends/monet5/sql_aggr_lng.mal
        sql/backends/monet5/sql_aggr_sht.mal
Branch: malparsing
Log Message:

Various fixes
- move maxarg checking to pushArgument
- setPolymorphic should recognize that we a single column now
- introduced some additional debugging in mal_resolve
- drop stream argument in typeChecker
- fix reader for debugger statements
- use upcast in sql_aggr operations


diffs (truncated from 756 to 300 lines):

diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c
--- a/monetdb5/mal/mal_function.c
+++ b/monetdb5/mal/mal_function.c
@@ -98,8 +98,6 @@ chkFlow(MalBlkPtr mb)
                p= getInstrPtr(mb,i);
                /* we have to keep track on the maximal arguments/block
                  because it is needed by the interpreter */
-               if( mb->maxarg < p->maxarg)
-                       mb->maxarg= p->maxarg;
                switch( p->barrier){
                case BARRIERsymbol:
                case CATCHsymbol:
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -1248,6 +1248,9 @@ pushArgument(MalBlkPtr mb, InstrPtr p, i
                if (mb->maxarg < pn->maxarg)
                        mb->maxarg = pn->maxarg;
        }
+       if( mb->maxarg < p->maxarg)
+               mb->maxarg= p->maxarg;
+
        p->argv[p->argc++] = varid;
        return p;
 }
@@ -1380,27 +1383,23 @@ destinationType(MalBlkPtr mb, InstrPtr p
 }
 
 /* For polymorphic instructions we should keep around the maximal
- * index to later allocate sufficient space for type resolutions
- * maps. Beware, that we only consider the instruction polymorphic if
- * it has an index or belongs to the signature. In other cases it
- * merely has to be filled. */
+ * index to later allocate sufficient space for type resolutions maps.
+ * Beware, that we should only consider the instruction polymorphic if
+ * it has a positive index or belongs to the signature. 
+ * BATs can only have a polymorphic type at the tail.
+ */
 inline void
 setPolymorphic(InstrPtr p, int tpe, int force)
 {
-       int c1 = 0, c2 = 0;
+       int c2;
 
        if (force == FALSE && tpe == TYPE_any)
                return;
-       if (isaBatType(tpe)) 
-               c1= TYPE_oid;
-       if (getTypeIndex(tpe) > 0)
+       if (getBatType(tpe) == TYPE_any){
                c2 = getTypeIndex(tpe);
-       else if (getBatType(tpe) == TYPE_any)
-               c2 = 1;
-       c1 = c1 > c2 ? c1 : c2;
-       if (c1 > 0 && c1 >= p->polymorphic)
-               p->polymorphic = c1 + 1;
-
+               if( c2 > 0 && c2 > p->polymorphic)
+                       p->polymorphic = c2 + 1;
+       }
 }
 
 /* Instructions are simply appended to a MAL block. It should always succeed.
diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c
--- a/monetdb5/mal/mal_parser.c
+++ b/monetdb5/mal/mal_parser.c
@@ -727,7 +727,7 @@ term(Client cntxt, MalBlkPtr curBlk, Ins
                                        setVarUDFtype(curBlk, cstidx);
                                } else {
                                        cstidx = defConstant(curBlk, tpe, &cst);
-                                       setPolymorphic(*curInstr, tpe, FALSE);
+                                       //setPolymorphic(*curInstr, tpe, FALSE);
                                        setVarUDFtype(curBlk, cstidx);
                                        free = 0;
                                }
diff --git a/monetdb5/mal/mal_resolve.c b/monetdb5/mal/mal_resolve.c
--- a/monetdb5/mal/mal_resolve.c
+++ b/monetdb5/mal/mal_resolve.c
@@ -25,10 +25,11 @@ static malType getPolyType(malType t, in
 static int updateTypeMap(int formal, int actual, int polytype[MAXTYPEVAR]);
 static int typeKind(MalBlkPtr mb, InstrPtr p, int i);
 
+/* #define _DEBUG_MAL_RESOLVE*/
 #define MAXMALARG 256
 
 str traceFcnName = "____";
-int tracefcn;
+int tracefcn = 1;
 int polyVector[MAXTYPEVAR];
 
 /*
@@ -118,6 +119,9 @@ findFunctionType(Module scope, MalBlkPtr
         * it will be looked up multiple types to resolve the instruction.[todo]
         * Simplify polytype using a map into the concrete argument table.
         */
+#ifdef _DEBUG_MAL_RESOLVE
+               fprintf(stderr,"findFunction %s.%s\n", getModuleId(p), 
getFunctionId(p));
+#endif
        m = scope;
        s = m->space[(int) (getSymbolIndex(getFunctionId(p)))];
        if (s == 0)
@@ -157,7 +161,7 @@ findFunctionType(Module scope, MalBlkPtr
                sig = getSignature(s);
                unmatched = 0;
 
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
                if (tracefcn) {
                        fprintf(stderr, "-->resolving\n");
                        fprintInstruction(stderr, mb, 0, p, LIST_MAL_ALL);
@@ -279,7 +283,7 @@ findFunctionType(Module scope, MalBlkPtr
                                int actual = getArgType(mb, p, i);
                                int formal = getArgType(s->def, sig, i);
                                if (resolveType(formal, actual) == -1) {
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
                                        char *ftpe = getTypeName(formal);
                                        char *atpe = getTypeName(actual);
                                        fprintf(stderr, "unmatched %d formal %s 
actual %s\n",
@@ -300,7 +304,7 @@ findFunctionType(Module scope, MalBlkPtr
                 * An optimizer may at a later stage automatically insert such
                 * coercion requests.
                 */
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
                if (tracefcn) {
                        char *tpe, *tpe2;
                        fprintf(stderr, "finished %s.%s unmatched=%d 
polymorphic=%d %d\n",
@@ -315,9 +319,9 @@ findFunctionType(Module scope, MalBlkPtr
                                                GDKfree(tpe);
                                        }
                        }
-                       fprintf(stderr, "-->resolving\n");
+                       fprintf(stderr, "-->resolving:");
                        fprintInstruction(stderr, mb, 0, p, LIST_MAL_ALL);
-                       fprintf(stderr, "++> test against signature\n");
+                       fprintf(stderr, "++> against :");
                        fprintInstruction(stderr, s->def, 0, getSignature(s), 
LIST_MAL_ALL);
                        tpe = getTypeName(getArgType(mb, p, unmatched));
                        tpe2 = getTypeName(getArgType(s->def, sig, unmatched));
@@ -391,6 +395,10 @@ findFunctionType(Module scope, MalBlkPtr
                 * Also mark all variables that are subject to garbage control.
                 * Beware, this is not yet effectuated in the interpreter.
                 */
+#ifdef _DEBUG_MAL_RESOLVE
+               fprintf(stderr,"TYPE RESOLVED:");
+               fprintInstruction(stderr, mb, 0, p, LIST_MAL_ALL);
+#endif
                p->typechk = TYPE_RESOLVED;
                for (i = 0; i < p->retc; i++) {
                        int ts = returntype[i];
@@ -454,10 +462,10 @@ findFunctionType(Module scope, MalBlkPtr
                }                                                               
                                                        \
                bindFunction(s, p, mb);
 
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
                if (tracefcn) {
+                       fprintf(stderr, "Finished matching:");
                        fprintInstruction(stderr, mb, 0, p, LIST_MAL_ALL);
-                       fprintf(stderr, "Finished matching\n");
                }
 #endif
                if (returntype && returntype != returns)
@@ -470,6 +478,12 @@ findFunctionType(Module scope, MalBlkPtr
         * arguments, but that clashes with one of the target variables.
         */
   wrapup:
+#ifdef _DEBUG_MAL_RESOLVE
+               if (tracefcn) {
+                       fprintf(stderr, "Wrapup matching returntype %d returns 
%d:",*returntype,*returns);
+                       fprintInstruction(stderr, mb, 0, p, LIST_MAL_ALL);
+               }
+#endif
        if (returntype && returntype != returns)
                GDKfree(returntype);
        return -3;
@@ -478,7 +492,7 @@ findFunctionType(Module scope, MalBlkPtr
 int
 resolveType(int dsttype, int srctype)
 {
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
        if (tracefcn) {
                char *dtpe = getTypeName(dsttype);
                char *stpe = getTypeName(srctype);
@@ -512,13 +526,13 @@ resolveType(int dsttype, int srctype)
                else if (t2 == TYPE_any)
                        t3 = t1;
                else {
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
                        if (tracefcn)
                                fprintf(stderr, "Tail can not be resolved \n");
 #endif
                        return -1;
                }
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
                if (tracefcn) {
                        int i2 = getTypeIndex(dsttype);
                        char *tpe1, *tpe2, *tpe3; 
@@ -534,7 +548,7 @@ resolveType(int dsttype, int srctype)
 #endif
                return newBatType(t3);
        }
-#ifdef DEBUG_MAL_RESOLVE
+#ifdef _DEBUG_MAL_RESOLVE
        if (tracefcn)
                fprintf(stderr, "Can not be resolved \n");
 #endif
@@ -575,7 +589,7 @@ typeMismatch(MalBlkPtr mb, InstrPtr p, i
  * to assignment.
  */
 void
-typeChecker(stream *out, Module scope, MalBlkPtr mb, InstrPtr p, int silent)
+typeChecker(Module scope, MalBlkPtr mb, InstrPtr p, int silent)
 {
        int s1 = -1, i, k;
        str olderrors;
@@ -598,14 +612,20 @@ typeChecker(stream *out, Module scope, M
                p->typechk = TYPE_RESOLVED;
                for (k = 0; k < p->retc; k++)
                        p->typechk = MIN(p->typechk, typeKind(mb, p, 0));
+#ifdef _DEBUG_MAL_RESOLVE
+               fprintf(stderr,"typeChecker signature matched\n");
+#endif
                return;
        }
        if (getFunctionId(p) && getModuleId(p)) {
-#ifdef DEBUG_MAL_RESOLVE
-               tracefcn = idcmp(getFunctionId(p), traceFcnName) == 0;
+#ifdef _DEBUG_MAL_RESOLVE
+               //tracefcn = idcmp(getFunctionId(p), traceFcnName) == 0;
 #endif
                m = findModule(scope, getModuleId(p));
                s1 = findFunctionType(m, mb, p, silent);
+#ifdef _DEBUG_MAL_RESOLVE
+               fprintf(stderr,"typeChecker matched %d\n",s1);
+#endif
                if (s1 >= 0)
                        return;
                /*
@@ -623,7 +643,11 @@ typeChecker(stream *out, Module scope, M
                if (!isaSignature(p) && !getInstrPtr(mb, 0)->polymorphic) {
                        if (!silent) {
                                if (!malLibraryEnabled(p->modname)) {
-                                       dumpExceptionsToStream(out, 
malLibraryHowToEnable(p->modname));
+                                       mb->errors = createMalException(mb, 
getPC(mb, p), TYPE,
+                                                                               
"'%s%s%s' library error in: %s",
+                                                                               
(getModuleId(p) ? getModuleId(p) : ""),
+                                                                               
(getModuleId(p) ? "." : ""),
+                                                                               
getFunctionId(p), malLibraryHowToEnable(p->modname));
                                } else {
                                        char *errsig;
 
@@ -640,6 +664,9 @@ typeChecker(stream *out, Module scope, M
                        p->typechk = TYPE_UNKNOWN;
                } else
                        p->typechk = TYPE_RESOLVED;
+#ifdef _DEBUG_MAL_RESOLVE
+               fprintf(stderr,"typeChecker  no-sig and no-oly could not find 
it %d\n",p->typechk);
+#endif
                return;
        }
        /*
@@ -648,8 +675,12 @@ typeChecker(stream *out, Module scope, M
         * This is achieved by propagation of the rhs types to the lhs
         * variables.
         */
-       if (getFunctionId(p))
+       if (getFunctionId(p)){
+#ifdef _DEBUG_MAL_RESOLVE
+               fprintf(stderr,"typeChecker function call break %s\n", 
getFunctionId(p));
+#endif
                return;
+       }
        if (p->retc >= 1 && p->argc > p->retc && p->argc != 2 * p->retc) {
                if (!silent)
                        mb->errors = createMalException(mb, getPC(mb, p), TYPE, 
"Multiple assignment mismatch");
@@ -663,6 +694,9 @@ typeChecker(stream *out, Module scope, M
                        s1 = resolveType(lhs, rhs);
                        if (s1 == -1) {
                                typeMismatch(mb, p, lhs, rhs, silent);
+#ifdef _DEBUG_MAL_RESOLVE
+                               fprintf(stderr,"typeChecker function mismatch 
%s\n", getFunctionId(p));
+#endif
                                return;
                        }
                } else {
@@ -720,22 +754,16 @@ void
 chkTypes(Module s, MalBlkPtr mb, int silent)
 {
        InstrPtr p = 0;
-       int i, chk = 0;
+       int i;
 
        for (i = 0; i < mb->stop; i++) {
                p = getInstrPtr(mb, i);
                assert (p != NULL);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to