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