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