I can answer my own question here.  First, apparently we have to run "sql.init();" before running the MAL program iff it includes "sql.mvc();"  Second, there is something wrong with the code generator--it is not generating initialization steps for X_15 and X_22.  When I added these, the function ran correctly.  Thus, before the barrier statement, I needed to add the lines,

    X_15 := nil:bat[:oid,:int];
    X_22 := nil:bat[:oid,:int];

Steve Morgan


From: Stephen P. Morgan <stephen_p_morgan@sbcglobal.net>
To: developers-list@monetdb.org
Sent: Mon, March 11, 2013 1:09:33 PM
Subject: Running MAL Programs Manually?

Should it be possible to run MAL programs manually, by reading them from a file?  I just tried a simple experiment and got an error message.

The experiment: I created a table, "test," with two columns, "field1" and field2."  I created a MAL query by issuing the SQL query, "EXPLAIN SELECT * FROM test;" and cut and pasted the output to a file.  I then stripped out all of the formatting characters ('|') and extraneous spaces.  I then re-entered mclient, choosing the MAL language, and read in the MAL form of the query with "\< junk.mal."  The interpreter then complained that two identifiers were not initialized (see output, below).  So, is it not possible to issue a MAL query by hand?  Or am I missing something?  (Again, please forgive me, I am new to MonetDB.)

Thanks,

Steve Morgan

mal>\< junk.mal
MAPI  = (monetdb) /tmp/.s.monetdb.50000
QUERY = function user.s1_1{autoCommit=true}():void;
        barrier X_41 := language.dataflow();
            X_2 := sql.mvc();
            X_3:bat[:oid,:oid]  := sql.tid(X_2,"sys","test");
            X_6 := sql.bind(X_2,"sys","test","field1",0);
            (X_9,r1_9) := sql.bind(X_2,"sys","test","field1",2);
            X_12 := sql.bind(X_2,"sys","test","field1",1);
            X_14 := sql.delta(X_6,X_9,r1_9,X_12);
            X_15 := algebra.leftfetchjoin(X_3,X_14);
            X_16 := sql.bind(X_2,"sys","test","field2",0);
            (X_18,r1_22) := sql.bind(X_2,"sys","test","field2",2);
            X_20 := sql.bind(X_2,"sys","test","field2",1);
            X_21 := sql.delta(X_16,X_18,r1_22,X_20);
            X_22 := algebra.leftfetchjoin(X_3,X_21);
            language.pass(X_3);
        exit X_41;
            X_23 := sql.resultSet(2,1,X_15);
            sql.rsColumn(X_23,"sys.test","field1","int",32,0,X_15);
            sql.rsColumn(X_23,"sys.test","field2","int",32,0,X_22);
            X_29 := io.stdout();
            sql.exportResult(X_29,X_23);
        end s1_1;
ERROR = !TypeException:user.s1_1[16]:'X_15' may not be used before being initialized
        !TypeException:user.s1_1[17]:'X_15' may not be used before being initialized
        !TypeException:user.s1_1[18]:'X_22' may not be used before being initialized