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

Reply via email to