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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list