Changeset: 7d60e0b06f33 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/7d60e0b06f33
Branch: default
Log Message:

Merge monetdbe_prepare.


diffs (truncated from 1933 to 300 lines):

diff --git a/ctest/tools/monetdbe/example2.c b/ctest/tools/monetdbe/example2.c
--- a/ctest/tools/monetdbe/example2.c
+++ b/ctest/tools/monetdbe/example2.c
@@ -157,7 +157,7 @@ main(void)
                error(err)
 
        monetdbe_statement *stmt = NULL;
-       if ((err = monetdbe_prepare(mdbe, "SELECT b, t FROM test where t = ?; 
", &stmt)) != NULL)
+       if ((err = monetdbe_prepare(mdbe, "SELECT b, t FROM test where t = ?; 
", &stmt, NULL)) != NULL)
                error(err)
        char s = 42;
        if ((err = monetdbe_bind(stmt, &s, 0)) != NULL)
@@ -170,7 +170,7 @@ main(void)
        if ((err = monetdbe_cleanup_statement(mdbe, stmt)) != NULL)
                error(err)
 
-       if ((err = monetdbe_prepare(mdbe, "SELECT b, y FROM test where y = ?; 
", &stmt)) != NULL)
+       if ((err = monetdbe_prepare(mdbe, "SELECT b, y FROM test where y = ?; 
", &stmt, NULL)) != NULL)
                error(err)
        char *y = "Hello";
        if ((err = monetdbe_bind(stmt, y, 0)) != NULL)
diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c
--- a/monetdb5/modules/mal/remote.c
+++ b/monetdb5/modules/mal/remote.c
@@ -1404,15 +1404,14 @@ static str RMTexec(Client cntxt, MalBlkP
                        BBPkeepref(results[i].id);
                }
 
-               if (tmp != MAL_SUCCEED) {
-                       for (int j = 0; j < i; j++) {
-                               BBPrelease(results[j].id);
-                       }
-               }
-               else {
+               if (tmp == MAL_SUCCEED) {
                        assert(rcb->context);
                        tmp = rcb->call(rcb->context, tblname, results, fields);
                }
+
+               for (int j = 0; j < i; j++)
+                       BBPrelease(results[j].id);
+
                GDKfree(results);
        }
 
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
@@ -534,7 +534,7 @@ SQLstatementIntern(Client c, const char 
                                }
 
                                if (!err)
-                                       err = mvc_export_prepare(be, c->fdout, 
"");
+                                       err = mvc_export_prepare(be, c->fdout);
                        }
                }
 
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
@@ -863,114 +863,27 @@ mvc_export_binary_bat(stream *s, BAT* bn
 }
 
 static int
-mvc_export_prepare_columnar(stream *out, cq *q, int nrows, sql_rel *r) {
+create_prepare_result(backend *b, cq *q, int nrows) {
        int error = -1;
 
-       BAT* btype              = COLnew(0, TYPE_int, nrows, TRANSIENT);
+       BAT* btype              = COLnew(0, TYPE_str, nrows, TRANSIENT);
        BAT* bimpl              = COLnew(0, TYPE_str, nrows, TRANSIENT);
        BAT* bdigits    = COLnew(0, TYPE_int, nrows, TRANSIENT);
        BAT* bscale             = COLnew(0, TYPE_int, nrows, TRANSIENT);
        BAT* bschema    = COLnew(0, TYPE_str, nrows, TRANSIENT);
        BAT* btable             = COLnew(0, TYPE_str, nrows, TRANSIENT);
        BAT* bcolumn    = COLnew(0, TYPE_str, nrows, TRANSIENT);
+       BAT* order              = NULL;
        node *n;
-       sql_subtype *t;
-       sql_arg *a;
-
-       if (!btype || !bdigits || !bscale || !bschema || !btable || !bcolumn)
-               goto bailout;
-
-       if (r && is_project(r->op) && r->exps) {
-               for (n = r->exps->h; n; n = n->next) {
-                       const char *name, *rname, *schema = NULL;
-                       sql_exp *e = n->data;
-
-                       t = exp_subtype(e);
-                       name = exp_name(e);
-                       if (!name && e->type == e_column && e->r)
-                               name = e->r;
-                       rname = exp_relname(e);
-                       if (!rname && e->type == e_column && e->l)
-                               rname = e->l;
-
-                       if (!schema)
-                               schema = "";
-
-                       if (!rname)
-                               rname = "";
-
-                       if (!name)
-                               name = "";
-
-                       if (    BUNappend(btype,        &t->type->localtype     
, false) != GDK_SUCCEED ||
-                                       BUNappend(bimpl,        t->type->impl   
        , false) != GDK_SUCCEED ||
-                                       BUNappend(bdigits,      &t->digits      
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bscale,       &t->scale       
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bschema,      schema          
                , false) != GDK_SUCCEED ||
-                                       BUNappend(btable,       rname           
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bcolumn,      name            
                , false) != GDK_SUCCEED)
-                               goto bailout;
-               }
-       }
-
-       if (q->f->ops) {
-               int i;
 
-               for (n = q->f->ops->h, i = 0; n; n = n->next, i++) {
-                       a = n->data;
-                       t = &a->type;
-
-                       if (    BUNappend(btype,        &t->type->localtype     
, false) != GDK_SUCCEED ||
-                                       BUNappend(bimpl,        t->type->impl   
        , false) != GDK_SUCCEED ||
-                                       BUNappend(bdigits,      &t->digits      
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bscale,       &t->scale       
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bschema,      str_nil         
                , false) != GDK_SUCCEED ||
-                                       BUNappend(btable,       str_nil         
                , false) != GDK_SUCCEED ||
-                                       BUNappend(bcolumn,      str_nil         
                , false) != GDK_SUCCEED)
-                               goto bailout;
-               }
-       }
-
-       // Little hack to get the name of the corresponding compiled MAL 
function known to the result receiver.
-       if (BUNappend(btable, q->f->imp, false) != GDK_SUCCEED)
-               goto bailout;
+       const size_t nr_columns = b->client->protocol == PROTOCOL_COLUMNAR? 7 : 
6;
 
-       mvc_export_binary_bat(out, btype);
-       mvc_export_binary_bat(out, bimpl);
-       mvc_export_binary_bat(out, bdigits);
-       mvc_export_binary_bat(out, bscale);
-       mvc_export_binary_bat(out, bschema);
-       mvc_export_binary_bat(out, btable);
-       mvc_export_binary_bat(out, bcolumn);
-
-       error = 0;
-
-       bailout:
-               BBPreclaim(btype);
-               BBPreclaim(bdigits);
-               BBPreclaim(bscale);
-               BBPreclaim(bschema);
-               BBPreclaim(btable);
-               BBPreclaim(bcolumn);
-               return error;
-}
-
-int
-mvc_export_prepare(backend *b, stream *out, str w)
-{
-       cq *q = b->q;
-       node *n;
-       int nparam = q->f->ops ? list_length(q->f->ops) : 0;
-       int nrows = nparam;
        size_t len1 = 0, len4 = 0, len5 = 0, len6 = 0, len7 =0; /* column 
widths */
        int len2 = 1, len3 = 1;
        sql_arg *a;
        sql_subtype *t;
        sql_rel *r = q->rel;
 
-       if(!out || GDKembedded())
-               return 0;
-
        if (r && (is_topn(r->op) || is_sample(r->op)))
                r = r->l;
        if (r && is_project(r->op) && r->exps) {
@@ -978,7 +891,7 @@ mvc_export_prepare(backend *b, stream *o
                nrows += list_length(r->exps);
 
                for (n = r->exps->h; n; n = n->next) {
-                       const char *name;
+                       const char *name = NULL, *rname = NULL, *schema = NULL;
                        sql_exp *e = n->data;
                        size_t slen;
 
@@ -994,9 +907,9 @@ mvc_export_prepare(backend *b, stream *o
                                len3++;
                                max3 *= 10;
                        }
-                       name = exp_relname(e);
-                       if (!name && e->type == e_column && e->l)
-                               name = e->l;
+                       rname = exp_relname(e);
+                       if (!rname && e->type == e_column && e->l)
+                               rname = e->l;
                        slen = name ? strlen(name) : 0;
                        if (slen > len5)
                                len5 = slen;
@@ -1009,88 +922,106 @@ mvc_export_prepare(backend *b, stream *o
                        slen = strlen(t->type->impl);
                        if (slen > len7)
                                len7 = slen;
+
+                       if (!schema)
+                               schema = "";
+
+                       if (!rname)
+                               rname = "";
+
+                       if (!name)
+                               name = "";
+
+                       if (    BUNappend(btype,        t->type->base.name      
, false) != GDK_SUCCEED ||
+                                       BUNappend(bimpl,        t->type->impl   
        , false) != GDK_SUCCEED ||
+                                       BUNappend(bdigits,      &t->digits      
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bscale,       &t->scale       
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bschema,      schema          
                , false) != GDK_SUCCEED ||
+                                       BUNappend(btable,       rname           
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bcolumn,      name            
                , false) != GDK_SUCCEED)
+                               goto wrapup;
                }
        }
 
-       /* calculate column widths */
-       if (q->f->ops) {
-               unsigned int max2 = 10, max3 = 10;      /* to help calculate 
widths */
+
+       if (!btype || !bdigits || !bscale || !bschema || !btable || !bcolumn)
+               goto wrapup;
 
-               for (n = q->f->ops->h; n; n = n->next) {
-                       size_t slen;
+       if (q->f->ops) {
+               int i;
 
+               for (n = q->f->ops->h, i = 0; n; n = n->next, i++) {
                        a = n->data;
                        t = &a->type;
-                       slen = strlen(t->type->base.name);
-                       if (slen > len1)
-                               len1 = slen;
-                       while (t->digits >= max2) {
-                               len2++;
-                               max2 *= 10;
-                       }
-                       while (t->scale >= max3) {
-                               len3++;
-                               max3 *= 10;
-                       }
+
+                       if (    BUNappend(btype,        t->type->base.name      
, false) != GDK_SUCCEED ||
+                                       BUNappend(bimpl,        t->type->impl   
        , false) != GDK_SUCCEED ||
+                                       BUNappend(bdigits,      &t->digits      
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bscale,       &t->scale       
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bschema,      str_nil         
                , false) != GDK_SUCCEED ||
+                                       BUNappend(btable,       str_nil         
                , false) != GDK_SUCCEED ||
+                                       BUNappend(bcolumn,      str_nil         
                , false) != GDK_SUCCEED)
+                               goto wrapup;
                }
        }
 
+       // A little hack to inform the result receiver of the name of the 
compiled mal program.
        if (b->client->protocol == PROTOCOL_COLUMNAR) {
-
-               /* write header, query type: Q_PREPARE */
-               if (mnstr_printf(out, "&5 %d %d 6 %d\n" /* TODO: add type here: 
r(esult) or u(pdate) */
-                               "%% 
.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare # table_name\n" 
"%% type,\tdigits,\tscale,\tschema,\ttable,\tcolumn,\timpl # name\n" "%% 
varchar,\tint,\tint,\tstr,\tstr,\tstr,\tstr # type\n" "%% %zu,\t%d,\t%d,\t"
-                               "%zu,\t%zu,\t%zu,\t%zu # length\n", q->id, 
nrows, nrows, len1, len2, len3, len4, len5, len6, len7) < 0) {
-                       return -1;
-               }
-               if (mnstr_flush(out, MNSTR_FLUSH_DATA) < 0)
-                       return -1;
-               if (mvc_export_prepare_columnar(out, q, nrows, r) < 0)
-                       return -1;
-       }
-       else {
-
-               /* write header, query type: Q_PREPARE */
-               if (mnstr_printf(out, "&5 %d %d 6 %d\n" /* TODO: add type here: 
r(esult) or u(pdate) */
-                               "%% 
.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare,\t.prepare # table_name\n" 
"%% type,\tdigits,\tscale,\tschema,\ttable,\tcolumn # name\n" "%% 
varchar,\tint,\tint,\tstr,\tstr,\tstr # type\n" "%% %zu,\t%d,\t%d,\t"
-                               "%zu,\t%zu,\t%zu # length\n", q->id, nrows, 
nrows, len1, len2, len3, len4, len5, len6) < 0) {
-                       return -1;
-               }
-               if (r && is_project(r->op) && r->exps) {
-                       for (n = r->exps->h; n; n = n->next) {
-                               const char *name, *rname, *schema = NULL;
-                               sql_exp *e = n->data;
-
-                               t = exp_subtype(e);
-                               name = exp_name(e);
-                               if (!name && e->type == e_column && e->r)
-                                       name = e->r;
-                               rname = exp_relname(e);
-                               if (!rname && e->type == e_column && e->l)
-                                       rname = e->l;
-
-                               if (mnstr_printf(out, "[ 
\"%s\",\t%u,\t%u,\t\"%s\",\t\"%s\",\t\"%s\"\t]\n", t->type->base.name, 
t->digits, t->scale, schema ? schema : "", rname ? rname : "", name ? name : 
"") < 0) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to