Changeset: 602d7a1062ed for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=602d7a1062ed Modified Files: ctest/tools/monetdbe/example_proxy.c monetdb5/modules/mal/remote.c sql/backends/monet5/sql_result.c tools/monetdbe/monetdbe.c Branch: monetdbe-proxy Log Message:
Fix redundant flush bug and refine remote's MAPI result handling. diffs (184 lines): diff --git a/ctest/tools/monetdbe/example_proxy.c b/ctest/tools/monetdbe/example_proxy.c --- a/ctest/tools/monetdbe/example_proxy.c +++ b/ctest/tools/monetdbe/example_proxy.c @@ -34,6 +34,9 @@ main(void) error("Failed to open database") // Assumes the existance of a table test (x INT, y STRING) on the remote. + if ((err = monetdbe_query(mdbe, "INSERT INTO test VALUES (100, 'WHAAT'); ", NULL, NULL)) != NULL) + error(err) + if ((err = monetdbe_query(mdbe, "SELECT x, y FROM test; ", &result, NULL)) != NULL) error(err) @@ -76,6 +79,55 @@ main(void) if ((err = monetdbe_cleanup_result(mdbe, result)) != NULL) error(err) + + if ((err = monetdbe_query(mdbe, "DELETE FROM test where x = 100;", NULL, NULL)) != NULL) + error(err) + + + if ((err = monetdbe_query(mdbe, "SELECT x, y, 1 AS some_int FROM test WHERE x > 10; ", &result, NULL)) != NULL) + error(err) + + fprintf(stdout, "Query result with %zu cols and %"PRId64" rows\n", result->ncols, result->nrows); + for (int64_t r = 0; r < result->nrows; r++) { + for (size_t c = 0; c < result->ncols; c++) { + monetdbe_column* rcol; + if ((err = monetdbe_result_fetch(result, &rcol, c)) != NULL) + error(err) + switch (rcol->type) { + case monetdbe_int32_t: { + monetdbe_column_int32_t * col = (monetdbe_column_int32_t *) rcol; + if (col->data[r] == col->null_value) { + printf("NULL"); + } else { + printf("%d", col->data[r]); + } + break; + } + case monetdbe_str: { + monetdbe_column_str * col = (monetdbe_column_str *) rcol; + if (col->is_null(col->data[r])) { + printf("NULL"); + } else { + printf("%s", (char*) col->data[r]); + } + break; + } + default: { + printf("UNKNOWN"); + } + } + + if (c + 1 < result->ncols) { + printf(", "); + } + } + printf("\n"); + } + + if ((err = monetdbe_cleanup_result(mdbe, result)) != NULL) + error(err) + + if (monetdbe_close(mdbe)) error("Failed to close database") return 0; 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 @@ -1102,7 +1102,7 @@ str RMTexec(Client cntxt, MalBlkPtr mb, /* Temporary hack: * use a callback to immediately handle columnar results before hdl is destroyed. */ - if(tmp == MAL_SUCCEED && rcb && mhdl) { + if(tmp == MAL_SUCCEED && rcb && mhdl && mapi_get_field_count(mhdl) == Q_TABLE) { int fields = mapi_get_field_count(mhdl); 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 @@ -953,8 +953,6 @@ mvc_export_binary_bat(stream *s, BAT* bn if (sendtheap) mnstr_write(s, /* theap */ Tbase(bn), bn->tvheap->free, 1); } - - mnstr_flush(s); } static int @@ -996,9 +994,9 @@ mvc_export_prepare_columnar(stream *out, if ( BUNappend(btype, &t->type->localtype , 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) + BUNappend(bschema, schema , false) != GDK_SUCCEED || + BUNappend(btable, rname , false) != GDK_SUCCEED || + BUNappend(bcolumn, name , false) != GDK_SUCCEED) goto bailout; } } @@ -1013,9 +1011,9 @@ mvc_export_prepare_columnar(stream *out, if ( BUNappend(btype, &t->type->localtype , 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) + BUNappend(bschema, str_nil , false) != GDK_SUCCEED || + BUNappend(btable, str_nil , false) != GDK_SUCCEED || + BUNappend(bcolumn, str_nil , false) != GDK_SUCCEED) goto bailout; } } @@ -1124,6 +1122,7 @@ mvc_export_prepare(backend *b, stream *o } if (b->client->protocol == PROTOCOL_COLUMNAR) { + if (mnstr_flush(out) < 0) return -1; mvc_export_prepare_columnar(out, q, nrows, r); } else { diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -919,7 +919,7 @@ monetdbe_result_cb(void* context, char* } static char* -monetdbe_query_remote(monetdbe_database_internal *mdbe, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows) +monetdbe_query_remote(monetdbe_database_internal *mdbe, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows, int *prepare_id) { // TODO: do something with affected_rows (void) affected_rows; @@ -945,6 +945,25 @@ monetdbe_query_remote(monetdbe_database_ o = pushStr(mb, o, mdbe->mid); o = pushBit(mb, o, TRUE); + + if (prepare_id) { + size_t query_len, input_query_len, prep_len = 0; + input_query_len = strlen(query); + query_len = input_query_len + 3; + const char PREPARE[] = "PREPARE "; + prep_len = sizeof(PREPARE)-1; + query_len += prep_len; + char *nq = NULL; + if (!(nq = GDKmalloc(query_len))) { + mdbe->msg = createException(MAL, "monetdbe.monetdbe_query_remote", "Could not setup query stream"); + return mdbe->msg; + } + strcpy(nq, PREPARE); + strcpy(nq + prep_len, query); + strcpy(nq + prep_len + input_query_len, "\n;"); + query = nq; + } + InstrPtr p = newStmt(mb, remoteRef, putRef); p = pushStr(mb, p, mdbe->mid); p = pushStr(mb, p, query); @@ -997,7 +1016,7 @@ monetdbe_query(monetdbe_database dbhdl, monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl; if (mdbe->mid) { - mdbe->msg = monetdbe_query_remote(mdbe, query, result, affected_rows); + mdbe->msg = monetdbe_query_remote(mdbe, query, result, affected_rows, NULL); } else { mdbe->msg = monetdbe_query_internal(mdbe, query, result, affected_rows, NULL, 'S'); @@ -1040,6 +1059,9 @@ monetdbe_prepare(monetdbe_database dbhdl if (!stmt) mdbe->msg = createException(MAL, "monetdbe.monetdbe_prepare", "Parameter stmt is NULL"); + else if (mdbe->mid) { + mdbe->msg = monetdbe_query_remote(mdbe, query, NULL, NULL, &prepare_id); + } else { mdbe->msg = monetdbe_query_internal(mdbe, query, NULL, NULL, &prepare_id, 'S'); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list