Changeset: 60c84e5af143 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=60c84e5af143
Modified Files:
        monetdb5/optimizer/opt_prelude.c
        monetdb5/optimizer/opt_prelude.h
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_execute.h
        sql/backends/monet5/sql_gencode.c
        sql/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out
        
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        
sql/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
        sql/test/BugTracker-2011/Tests/crash_on_alias.Bug-2798.stable.out.int128
        sql/test/BugTracker-2011/Tests/func_iter_vs_bulk.Bug-2826.stable.out
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        sql/test/BugTracker-2013/Tests/between.Bug-3259.stable.out.int128
        sql/test/BugTracker-2014/Tests/in_incorrect_multi.Bug-3462.stable.err
        sql/test/BugTracker-2014/Tests/manifold.Bug-3556.stable.out
        sql/test/BugTracker-2014/Tests/nil_2dec_lng.Bug-3592.stable.out
        
sql/test/BugTracker-2014/Tests/two-column-aggr-with-null.Bug-3428.stable.out
        sql/test/BugTracker/Tests/explain.SF-1739353.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/leaks/Tests/check0_bam.stable.out.int128
        sql/test/leaks/Tests/check1_bam.stable.out.int128
        sql/test/leaks/Tests/check2_bam.stable.out.int128
        sql/test/leaks/Tests/check3_bam.stable.out.int128
        sql/test/leaks/Tests/check4_bam.stable.out.int128
        sql/test/leaks/Tests/check5_bam.stable.out.int128
        sql/test/leaks/Tests/drop3_bam.stable.out.int128
        sql/test/leaks/Tests/select1_bam.stable.out.int128
        sql/test/leaks/Tests/select2_bam.stable.out.int128
        sql/test/leaks/Tests/temp1_bam.stable.out.int128
        sql/test/leaks/Tests/temp2_bam.stable.out.int128
        sql/test/leaks/Tests/temp3_bam.stable.out.int128
Branch: resultset
Log Message:

Result set code generation upgrade
The construction of SQL result sets have been changed into a single
call that contains the BATs with structure information and a variable
list of value columns.

The MAL interface change will make it easier at a later stage to
replace the way result sets are rendered end shipped to a front end.

This is the first checkpoint check-in. Next are the COPY into/from
code should be upgraded and cruft being removed.


diffs (truncated from 2934 to 300 lines):

diff --git a/monetdb5/optimizer/opt_prelude.c b/monetdb5/optimizer/opt_prelude.c
--- a/monetdb5/optimizer/opt_prelude.c
+++ b/monetdb5/optimizer/opt_prelude.c
@@ -71,6 +71,7 @@ str countRef;
 str subcountRef;
 str copyRef;
 str copy_fromRef;
+str copy_intoRef;
 str count_no_nilRef;
 str crossRef;
 str createRef;
@@ -327,6 +328,7 @@ void optimizerInit(void)
        subcountRef = putName("subcount",8);
        copyRef = putName("copy",4);
        copy_fromRef = putName("copy_from",9);
+       copy_intoRef = putName("copy_into",9);
        count_no_nilRef = putName("count_no_nil",12);
        crossRef = putName("crossproduct",12);
        createRef = putName("create",6);
diff --git a/monetdb5/optimizer/opt_prelude.h b/monetdb5/optimizer/opt_prelude.h
--- a/monetdb5/optimizer/opt_prelude.h
+++ b/monetdb5/optimizer/opt_prelude.h
@@ -69,6 +69,7 @@ opt_export  str countRef;
 opt_export  str subcountRef;
 opt_export  str copyRef;
 opt_export  str copy_fromRef;
+opt_export  str copy_intoRef;
 opt_export  str count_no_nilRef;
 opt_export  str crossRef;
 opt_export  str createRef;
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -920,60 +920,25 @@ UPGcreate_func(Client cntxt, MalBlkPtr m
 {
        mvc *sql = NULL;
        str msg = MAL_SUCCEED;
-       str sname = *getArgReference_str(stk, pci, 1), osname;
-       str func = *getArgReference_str(stk, pci, 2);
+       str func = *getArgReference_str(stk, pci, 1);
        stmt *s;
 
        if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
                return msg;
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
-       osname = cur_schema(sql)->base.name;
-       mvc_set_schema(sql, sname);
        s = sql_parse(sql, sa_create(), func, 0);
        if (s && s->type == st_catalog) {
                char *schema = 
((stmt*)s->op1->op4.lval->h->data)->op4.aval->data.val.sval;
                sql_func *func = 
(sql_func*)((stmt*)s->op1->op4.lval->t->data)->op4.aval->data.val.pval;
 
                msg = create_func(sql, schema, func);
-               mvc_set_schema(sql, osname);
        } else {
-               mvc_set_schema(sql, osname);
                throw(SQL, "sql.catalog", "function creation failed '%s'", 
func);
        }
        return msg;
 }
 
-str
-UPGcreate_view(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{
-       mvc *sql = NULL;
-       str msg = MAL_SUCCEED;
-       str sname = *getArgReference_str(stk, pci, 1), osname;
-       str view = *getArgReference_str(stk, pci, 2);
-       stmt *s;
-
-       if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
-               return msg;
-       if ((msg = checkSQLContext(cntxt)) != NULL)
-               return msg;
-       osname = cur_schema(sql)->base.name;
-       mvc_set_schema(sql, sname);
-       s = sql_parse(sql, sa_create(), view, 0);
-       if (s && s->type == st_catalog) {
-               char *schema = 
((stmt*)s->op1->op4.lval->h->data)->op4.aval->data.val.sval;
-               sql_table *v = 
(sql_table*)((stmt*)s->op1->op4.lval->h->next->data)->op4.aval->data.val.pval;
-               int temp = 
((stmt*)s->op1->op4.lval->t->data)->op4.aval->data.val.ival;
-
-               msg = create_table_or_view(sql, schema, v, temp);
-               mvc_set_schema(sql, osname);
-       } else {
-               mvc_set_schema(sql, osname);
-               throw(SQL, "sql.catalog", "view creation failed '%s'", view);
-       }
-       return msg;
-}
-
 static char *
 create_trigger(mvc *sql, char *sname, char *tname, char *triggername, int 
time, int orientation, int event, char *old_name, char *new_name, char 
*condition, char *query)
 {
@@ -2391,10 +2356,10 @@ mvc_result_file_wrap(Client cntxt, MalBl
        ssize_t len;
        int *res_id = getArgReference_int(stk, pci, 0);
        int *nr_cols = getArgReference_int(stk, pci, 1);
-       unsigned char **T = (unsigned char **) getArgReference_str(stk, pci, 2);
-       unsigned char **R = (unsigned char **) getArgReference_str(stk, pci, 3);
-       unsigned char **S = (unsigned char **) getArgReference_str(stk, pci, 4);
-       unsigned char **N = (unsigned char **) getArgReference_str(stk, pci, 5);
+       unsigned char **T = (unsigned char **) getArgReference(stk, pci, 2);
+       unsigned char **R = (unsigned char **) getArgReference(stk, pci, 3);
+       unsigned char **S = (unsigned char **) getArgReference(stk, pci, 4);
+       unsigned char **N = (unsigned char **) getArgReference(stk, pci, 5);
        int mtype = getArgType(mb, pci, 6);
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
@@ -2432,7 +2397,231 @@ mvc_result_file_wrap(Client cntxt, MalBl
        return res;
 }
 
-/* str mvc_result_table_wrap(int *res_id, int *nr_cols, int *qtype, bat 
*order_bid); */
+/* pattern resultSet{unsafe}(tbl:bat[:oid,:str], attr:bat[:oid,:str], 
tpe:bat[:oid,:str], len:bat[:oid,:int],scale:bat[:oid,:int], 
cols:bat[:oid,:any]...) :int */
+/* New result set rendering infrastructure */
+static str
+mvc_result_set_wrap( Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       int *res_id =getArgReference_int(stk,pci,0);
+       bat tblId= *getArgReference_bat(stk, pci,1);
+       bat atrId= *getArgReference_bat(stk, pci,2);
+       bat tpeId= *getArgReference_bat(stk, pci,3);
+       bat lenId= *getArgReference_bat(stk, pci,4);
+       bat scaleId= *getArgReference_bat(stk, pci,5);
+       bat bid;
+       int i,res;
+       str tblname, colname, tpename, msg= MAL_SUCCEED;
+       int *digits, *scaledigits;
+       oid o = 0;
+       BATiter itertbl,iteratr,itertpe;
+       mvc *m = NULL;
+       BAT *b, *tbl, *atr, *tpe,*len,*scale;
+
+       if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+       bid = *getArgReference_bat(stk,pci,6);
+       b = BATdescriptor(bid);
+       if ( b == NULL)
+               throw(MAL,"sql.resultset","failed to access order column");
+       res = *res_id = mvc_result_table(m, pci->argc - (pci->retc + 5), 1, b);
+       if (res < 0)
+               msg = createException(SQL, "sql.resultSet", "failed");
+       BBPunfix(b->batCacheid);
+
+       tbl = BATdescriptor(tblId);
+       atr = BATdescriptor(atrId);
+       tpe = BATdescriptor(tpeId);
+       len = BATdescriptor(lenId);
+       scale = BATdescriptor(scaleId);
+       if( msg || tbl == NULL || atr == NULL || tpe == NULL || len == NULL || 
scale == NULL)
+               goto wrapup_result_set;
+       // mimick the old rsColumn approach;
+       itertbl = bat_iterator(tbl);
+       iteratr = bat_iterator(atr);
+       itertpe = bat_iterator(tpe);
+       digits = (int*) Tloc(len,BUNfirst(len));
+       scaledigits = (int*) Tloc(scale,BUNfirst(scale));
+
+       for( i = 6; msg == MAL_SUCCEED && i< pci->argc; i++, o++){
+               bid = *getArgReference_bat(stk,pci,i);
+               tblname = BUNtail(itertbl,o);
+               colname = BUNtail(iteratr,o);
+               tpename = BUNtail(itertpe,o);
+               b = BATdescriptor(bid);
+               if ( b == NULL)
+                       msg= createException(MAL,"sql.resultset","failed to 
access result column");
+               else
+               if (mvc_result_column(m, tblname, colname, tpename, *digits++, 
*scaledigits++, b))
+                       msg = createException(SQL, "sql.resultset", 
"mvc_result_column failed");
+               if( b)
+                       BBPreleaseref(bid);
+       }
+       // now sent it to the channel cntxt->fdout
+       if (mvc_export_result(cntxt->sqlcontext, cntxt->fdout, res))
+               msg = createException(SQL, "sql.resultset", "failed");
+wrapup_result_set:
+       if( tbl) BBPreleaseref(tblId);
+       if( atr) BBPreleaseref(atrId);
+       if( tpe) BBPreleaseref(tpeId);
+       if( len) BBPreleaseref(lenId);
+       if( scale) BBPreleaseref(scaleId);
+       return msg;
+}
+
+/* Copy the result set into a CSV file */
+str
+mvc_copy_into_wrap( Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       int *res_id =getArgReference_int(stk,pci,0);
+       str fname = *getArgReference_str(stk,pci,1);
+       str colsep = *getArgReference_str(stk,pci,2);
+       str rowsep = *getArgReference_str(stk,pci,3);
+       str quoterep = *getArgReference_str(stk,pci,4);
+       str nullrep = *getArgReference_str(stk,pci,5);
+
+       bat tblId= *getArgReference_bat(stk, pci,6);
+       bat atrId= *getArgReference_bat(stk, pci,7);
+       bat tpeId= *getArgReference_bat(stk, pci,8);
+       bat lenId= *getArgReference_bat(stk, pci,9);
+       bat scaleId= *getArgReference_bat(stk, pci,10);
+       bat bid;
+       int i,res;
+       str tblname, colname, tpename, msg= MAL_SUCCEED;
+       int *digits, *scaledigits;
+       oid o = 0;
+       BATiter itertbl,iteratr,itertpe;
+       mvc *m = NULL;
+       BAT *b, *tbl, *atr, *tpe,*len,*scale;
+
+       (void) fname;
+       (void) colsep;
+       (void) rowsep;
+       (void) quoterep;
+       (void) nullrep;
+
+       if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+       bid = *getArgReference_bat(stk,pci,6);
+       b = BATdescriptor(bid);
+       if ( b == NULL)
+               throw(MAL,"sql.resultset","failed to access order column");
+       res = *res_id = mvc_result_table(m, pci->argc - (pci->retc + 5), 1, b);
+       if (res < 0)
+               msg = createException(SQL, "sql.resultSet", "failed");
+       BBPunfix(b->batCacheid);
+
+       tbl = BATdescriptor(tblId);
+       atr = BATdescriptor(atrId);
+       tpe = BATdescriptor(tpeId);
+       len = BATdescriptor(lenId);
+       scale = BATdescriptor(scaleId);
+       if( msg || tbl == NULL || atr == NULL || tpe == NULL || len == NULL || 
scale == NULL)
+               goto wrapup_result_set;
+       // mimick the old rsColumn approach;
+       itertbl = bat_iterator(tbl);
+       iteratr = bat_iterator(atr);
+       itertpe = bat_iterator(tpe);
+       digits = (int*) Tloc(len,BUNfirst(len));
+       scaledigits = (int*) Tloc(scale,BUNfirst(scale));
+
+       for( i = 11; msg == MAL_SUCCEED && i< pci->argc; i++, o++){
+               bid = *getArgReference_bat(stk,pci,i);
+               tblname = BUNtail(itertbl,o);
+               colname = BUNtail(iteratr,o);
+               tpename = BUNtail(itertpe,o);
+               b = BATdescriptor(bid);
+               if ( b == NULL)
+                       msg= createException(MAL,"sql.resultset","failed to 
access result column");
+               else
+               if (mvc_result_column(m, tblname, colname, tpename, *digits++, 
*scaledigits++, b))
+                       msg = createException(SQL, "sql.resultset", 
"mvc_result_column failed");
+               if( b)
+                       BBPreleaseref(bid);
+       }
+       // now sent it to the channel cntxt->fdout
+       if (mvc_export_result(cntxt->sqlcontext, cntxt->fdout, res))
+               msg = createException(SQL, "sql.resultset", "failed");
+wrapup_result_set:
+       if( tbl) BBPreleaseref(tblId);
+       if( atr) BBPreleaseref(atrId);
+       if( tpe) BBPreleaseref(tpeId);
+       if( len) BBPreleaseref(lenId);
+       if( scale) BBPreleaseref(scaleId);
+       return msg;
+}
+
+/* pattern resultSet{unsafe}(tbl:bat[:oid,:str], attr:bat[:oid,:str], 
tpe:bat[:oid,:str], len:bat[:oid,:int],scale:bat[:oid,:int], cols:any...) :int 
*/
+str
+mvc_row_value_wrap( Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       int *res_id= getArgReference_int(stk, pci,0);
+       bat tblId= *getArgReference_bat(stk, pci,1);
+       bat atrId= *getArgReference_bat(stk, pci,2);
+       bat tpeId= *getArgReference_bat(stk, pci,3);
+       bat lenId= *getArgReference_bat(stk, pci,4);
+       bat scaleId= *getArgReference_bat(stk, pci,5);
+       int i, res;
+       str tblname, colname, tpename, msg= MAL_SUCCEED;
+       int *digits, *scaledigits;
+       oid o = 0;
+       BATiter itertbl,iteratr,itertpe;
+       mvc *m = NULL;
+//     res_table *t= NULL;
+       ptr v;
+       int mtype;
+       BAT  *tbl, *atr, *tpe,*len,*scale;
+
+       if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+//     m->results = t = res_table_create(m->session->tr, m->result_id++, 
pci->argc - (pci->retc+5), 1, m->results, NULL);
+       res = *res_id = mvc_result_table(m, pci->argc - (pci->retc + 5), 1, 
NULL);
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to