Changeset: 55fd678c6070 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=55fd678c6070
Modified Files:
        monetdb5/modules/mal/mal_mapi.c
        sql/backends/monet5/mal_backend.h
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_result.c
        sql/backends/monet5/sql_scenario.c
        sql/server/sql_qc.c
        sql/storage/bat/res_table.c
Branch: pyapi
Log Message:

Merge with embedded branch.


diffs (184 lines):

diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -443,6 +443,11 @@ SERVERlisten(int *Port, str *Usockfile, 
        accept_any = GDKgetenv_istrue("mapi_open");
        autosense = GDKgetenv_istrue("mapi_autosense");
 
+       /* early way out, we do not want to listen on any port when running in 
embedded mode */
+       if (GDKgetenv_istrue("mapi_disable")) {
+               return MAL_SUCCEED;
+       }
+
        psock = GDKmalloc(sizeof(SOCKET) * 3);
        if (psock == NULL)
                throw(MAL,"mal_mapi.listen", MAL_MALLOC_FAIL);
diff --git a/sql/backends/monet5/mal_backend.h 
b/sql/backends/monet5/mal_backend.h
--- a/sql/backends/monet5/mal_backend.h
+++ b/sql/backends/monet5/mal_backend.h
@@ -26,7 +26,8 @@
 
 typedef enum output_format {
        OFMT_CSV  =     0,
-       OFMT_JSON =     1
+       OFMT_JSON =     1,
+       OFMT_NONE = 3
 } ofmt;
 
 typedef struct backend {
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
@@ -3166,6 +3166,13 @@ mvc_scalar_value_wrap(Client cntxt, MalB
        b = cntxt->sqlcontext;
        if (ATOMextern(mtype))
                p = *(ptr *) p;
+       
+       // scalar values are single-column result sets
+       mvc_result_table(b->mvc, 1, 1, NULL);
+       mvc_result_value(b->mvc, *tn, *cn, *type, *digits, *scale, p, mtype);
+       if (b->output_format == OFMT_NONE) {
+               return MAL_SUCCEED;
+       }
        if (b->out == NULL || mvc_export_value(b, b->out, 1, *tn, *cn, *type, 
*digits, *scale, *eclass, p, mtype, "", "NULL") != SQL_OK)
                throw(SQL, "sql.exportValue", "failed");
        return MAL_SUCCEED;
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -85,7 +85,9 @@ SQLstatementIntern(Client c, str *expr, 
        if (!o)
                throw(SQL, "SQLstatement", "Out of memory");
        *o = *m;
-
+       
+       /* hide query cache, this causes crashes in SQLtrans() due to 
uninitialized memory otherwise */
+       m->qc = NULL;
        /* create private allocator */
        m->sa = NULL;
        SQLtrans(m);
@@ -95,6 +97,10 @@ SQLstatementIntern(Client c, str *expr, 
        be = sql;
        sql = backend_create(m, c);
        sql->output_format = be->output_format;
+       if (!output) {
+               sql->output_format = OFMT_NONE;
+       }
+       // and do it again
        m->qc = NULL;
        m->caching = 0;
        m->user_id = m->role_id = USER_MONETDB;
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -1778,7 +1778,11 @@ mvc_export_result(backend *b, stream *s,
 
        if (!s || !t)
                return 0;
-
+       
+       /* Proudly supporting SQLstatementIntern's output flag */
+       if (b->output_format == OFMT_NONE) {
+               return 0;
+       }
        /* we shouldn't have anything else but Q_TABLE here */
        assert(t->query_type == Q_TABLE);
        if (t->tsep)
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -178,8 +178,8 @@ SQLprelude(void *ret)
        tmp = SQLinit();
        if (tmp != MAL_SUCCEED)
                return (tmp);
-       fprintf(stdout, "# MonetDB/SQL module loaded\n");
-       fflush(stdout);         /* make merovingian see this *now* */
+       mnstr_printf(GDKout, "# MonetDB/SQL module loaded\n");
+       mnstr_flush(GDKout);    /* make merovingian see this *now* */
 
        /* only register availability of scenarios AFTER we are inited! */
        s->name = "sql";
@@ -443,13 +443,14 @@ SQLinitClient(Client c)
        if (m->session->tr)
                reset_functions(m->session->tr);
        /* pass through credentials of the user if not console */
-       schema = monet5_user_get_def_schema(m, c->user);
-       if (!schema) {
+       if (!isAdministrator(c)) {
+               schema = monet5_user_get_def_schema(m, c->user);
+               if (!schema) {
+                       _DELETE(schema);
+                       throw(PERMD, "SQLinitClient", "08004!schema 
authorization error");
+               }
                _DELETE(schema);
-               throw(PERMD, "SQLinitClient", "08004!schema authorization 
error");
        }
-       _DELETE(schema);
-
        /*expect SQL text first */
        be->language = 'S';
        /* Set state, this indicates an initialized client scenario */
@@ -480,7 +481,7 @@ SQLinitClient(Client c)
                if (fullname) {
                        str filename = fullname;
                        str p, n;
-                       fprintf(stdout, "# SQL catalog created, loading sql 
scripts once\n");
+                       mnstr_printf(GDKout, "# SQL catalog created, loading 
sql scripts once\n");
                        do {
                                p = strchr(filename, PATH_SEP);
                                if (p)
@@ -490,7 +491,7 @@ SQLinitClient(Client c)
                                } else {
                                        n++;
                                }
-                               fprintf(stdout, "# loading sql script: %s\n", 
n);
+                               mnstr_printf(GDKout, "# loading sql script: 
%s\n", n);
                                fd = open_rastream(filename);
                                if (p)
                                        filename = p + 1;
diff --git a/sql/server/sql_qc.c b/sql/server/sql_qc.c
--- a/sql/server/sql_qc.c
+++ b/sql/server/sql_qc.c
@@ -115,7 +115,6 @@ void
 qc_destroy(qc *cache)
 {
        cq *q, *n;
-
        for (q = cache->q; q; q = n) {
                n = q->next;
 
diff --git a/sql/storage/bat/res_table.c b/sql/storage/bat/res_table.c
--- a/sql/storage/bat/res_table.c
+++ b/sql/storage/bat/res_table.c
@@ -52,6 +52,7 @@ res_col *
 res_col_create(sql_trans *tr, res_table *t, const char *tn, const char *name, 
const char *typename, int digits, int scale, int mtype, void *val)
 {
        res_col *c = t->cols + t->cur_col;
+       BAT *b;
 
        if (!sql_find_subtype(&c->type, typename, digits, scale)) 
                sql_init_subtype(&c->type, sql_trans_bind_type(tr, NULL, 
typename), digits, scale);
@@ -61,13 +62,17 @@ res_col_create(sql_trans *tr, res_table 
        c->p = NULL;
        c->mtype = mtype;
        if (mtype == TYPE_bat) {
-               BAT *b = (BAT*)val;
-
-               c->b = b->batCacheid;
-               bat_incref(c->b);
-       } else {
-               c->p = ATOMdup(mtype, val);
+               b = (BAT*)val;
+       } else { // wrap scalar values in BATs for result consistency
+               b = BATnew(TYPE_void, mtype, 0, TRANSIENT);
+               assert (b != NULL);
+               BUNappend(b, val, FALSE);
+               BATsetcount(b, 1);
+               BATseqbase(b, 0);
+               BATsettrivprop(b);
        }
+       c->b = b->batCacheid;
+       bat_incref(c->b);
        t->cur_col++;
        assert(t->cur_col <= t->nr_cols);
        return c;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to