Changeset: a0a528ae8494 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a0a528ae8494 Modified Files: sql/backends/monet5/sql_result.c tools/monetdbe/monetdbe.c tools/monetdbe/monetdbe.h Branch: default Log Message:
In monetdbe provide low level type info for parameters in prepared statements. diffs (206 lines): 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 @@ -862,6 +862,7 @@ mvc_export_prepare_columnar(stream *out, int error = -1; BAT* btype = COLnew(0, TYPE_int, 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); @@ -897,6 +898,7 @@ mvc_export_prepare_columnar(stream *out, 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 || @@ -914,6 +916,7 @@ mvc_export_prepare_columnar(stream *out, 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 || @@ -928,6 +931,7 @@ mvc_export_prepare_columnar(stream *out, goto bailout; 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); @@ -953,7 +957,7 @@ mvc_export_prepare(backend *b, stream *o 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; /* column widths */ + 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; @@ -997,6 +1001,9 @@ mvc_export_prepare(backend *b, stream *o slen = name ? strlen(name) : 0; if (slen > len6) len6 = slen; + slen = strlen(t->type->impl); + if (slen > len7) + len7 = slen; } } @@ -1023,20 +1030,27 @@ mvc_export_prepare(backend *b, stream *o } } - /* 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 (b->client->protocol == PROTOCOL_COLUMNAR) { - 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; diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -1103,7 +1103,7 @@ monetdbe_prepare_cb(void* context, char* monetdbe_database_internal *mdbe = ((struct prepare_callback_context*) context)->mdbe; int *prepare_id = ((struct prepare_callback_context*) context)->prepare_id; - if (nr_results != 6) // 1) btype 2) bdigits 3) bscale 4) bschema 5) btable 6) bcolumn + if (nr_results != 7) // 1) btype 2) bdigits 3) bscale 4) bschema 5) btable 6) bcolumn return createException(SQL, "monetdbe.monetdbe_prepare_cb", SQLSTATE(42000) "result table for prepared statement is wrong."); backend *be = NULL; @@ -1111,6 +1111,7 @@ monetdbe_prepare_cb(void* context, char* return mdbe->msg; BAT* btype = NULL; + BAT* bimpl = NULL; BAT* bdigits = NULL; BAT* bscale = NULL; BAT* bschema = NULL; @@ -1120,6 +1121,7 @@ monetdbe_prepare_cb(void* context, char* size_t nparams = 0; BATiter bcolumn_iter = {0}; BATiter btable_iter = {0}; + BATiter bimpl_iter = {0}; char* function = NULL; Symbol prg = NULL; MalBlkPtr mb = NULL; @@ -1134,11 +1136,12 @@ monetdbe_prepare_cb(void* context, char* str msg = MAL_SUCCEED; if (!(btype = BATdescriptor(results[0].id)) || - !(bdigits = BATdescriptor(results[1].id)) || - !(bscale = BATdescriptor(results[2].id)) || - !(bschema = BATdescriptor(results[3].id)) || - !(btable = BATdescriptor(results[4].id)) || - !(bcolumn = BATdescriptor(results[5].id))) + !(bimpl = BATdescriptor(results[1].id)) || + !(bdigits = BATdescriptor(results[2].id)) || + !(bscale = BATdescriptor(results[3].id)) || + !(bschema = BATdescriptor(results[4].id)) || + !(btable = BATdescriptor(results[5].id)) || + !(bcolumn = BATdescriptor(results[6].id))) { msg = createException(SQL, "monetdbe.monetdbe_prepare_cb", SQLSTATE(42000) "Cannot access prepare result"); goto cleanup; @@ -1147,6 +1150,7 @@ monetdbe_prepare_cb(void* context, char* nparams = BATcount(btype); if (nparams != BATcount(bdigits) || + nparams != BATcount(bimpl) || nparams != BATcount(bscale) || nparams != BATcount(bschema) || nparams + 1 != BATcount(btable) || @@ -1158,6 +1162,7 @@ monetdbe_prepare_cb(void* context, char* bcolumn_iter = bat_iterator(bcolumn); btable_iter = bat_iterator(btable); + bimpl_iter = bat_iterator(bimpl); function = BUNtvar(btable_iter, BATcount(btable)-1); { @@ -1212,12 +1217,14 @@ monetdbe_prepare_cb(void* context, char* for (size_t i = 0; i < nparams; i++) { - char* table = BUNtvar(btable_iter, i); + char* table = BUNtvar(btable_iter, i); if (strNil(table)) { // input argument sql_type *t = SA_ZNEW(sa, sql_type); t->localtype = *(int*) Tloc(btype, i); + char* impl = BUNtvar(bimpl_iter, i); + t->impl = GDKstrdup(impl); sql_subtype *st = SA_ZNEW(sa, sql_subtype); sql_init_subtype(st, t, (unsigned) *(int*) Tloc(bdigits, i), (unsigned) *(int*) Tloc(bscale, i)); @@ -1283,6 +1290,7 @@ monetdbe_prepare_cb(void* context, char* cleanup: // clean these up if (btype) BBPunfix(btype->batCacheid); + if (bimpl) BBPunfix(bimpl->batCacheid); if (bdigits) BBPunfix(bdigits->batCacheid); if (bscale) BBPunfix(bscale->batCacheid); if (bschema) BBPunfix(bschema->batCacheid); @@ -1551,6 +1559,19 @@ monetdbe_bind(monetdbe_statement *stmt, } char* +monetdbe_get_type_info(monetdbe_statement *stmt, str* data, size_t i) +{ + monetdbe_stmt_internal *stmt_internal = (monetdbe_stmt_internal*)stmt; + + if (i >= stmt->nparam) + return createException(MAL, "monetdbe.monetdbe_bind", "Parameter %zu not bound to a value", i); + sql_arg *a = (sql_arg*)list_fetch(stmt_internal->q->f->ops, (int) i); + assert(a); + *data = a->type.type->impl; + return MAL_SUCCEED; +} + +char* monetdbe_execute(monetdbe_statement *stmt, monetdbe_result **result, monetdbe_cnt *affected_rows) { monetdbe_result_internal *res_internal = NULL; diff --git a/tools/monetdbe/monetdbe.h b/tools/monetdbe/monetdbe.h --- a/tools/monetdbe/monetdbe.h +++ b/tools/monetdbe/monetdbe.h @@ -161,6 +161,7 @@ monetdbe_export char* monetdbe_cleanup_r monetdbe_export char* monetdbe_prepare(monetdbe_database dbhdl, char *query, monetdbe_statement **stmt); monetdbe_export char* monetdbe_bind(monetdbe_statement *stmt, void *data, size_t parameter_nr); +monetdbe_export char* monetdbe_get_type_info(monetdbe_statement *stmt, char** data, size_t parameter_nr); monetdbe_export char* monetdbe_execute(monetdbe_statement *stmt, monetdbe_result **result, monetdbe_cnt* affected_rows); monetdbe_export char* monetdbe_cleanup_statement(monetdbe_database dbhdl, monetdbe_statement *stmt); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list