Changeset: ebea7ee57059 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ebea7ee57059 Modified Files: design.txt sql/backends/monet5/sql_execute.c tools/monetdbe/monetdbe.c Branch: monetdbe-proxy Log Message:
Work in process on prepared statments. diffs (truncated from 310 to 300 lines): diff --git a/design.txt b/design.txt --- a/design.txt +++ b/design.txt @@ -56,4 +56,45 @@ stuurt header op welke ook de volgorde v de client leest de header stream en pakt daarna de onderliggende read stream en vangt daarmee de bats op. +handling monetdbe_prepare +Normale prepare komt in + +sql_scenario.c:parser terecht. Daar wordt de PREPARE herkent en daar wordt m(ode) van de mvc +op m_prepare gezet. de sql_parse operatie parst de hele query en maakt een geoptimaliseerd relationeel plan +met place holders. Deze wordt vervolgens in de query cache gestopt via sql_qc.c:qc_insert. +Een id naar de query in de qc wordt teruggegeven en bewaard in de backend van de mvc. + +normale exec + +#0 rel_nop (query=0x7fffd42c6830, rel=0x7ffff02e1858, se=0x7fffd42c67e0, fs=32772, ek=...) + at /home/aris/sources/monetdb/sql/server/rel_select.c:3137 +#1 0x00007ffff1eacebc in rel_value_exp2 (query=0x7fffd42c6830, rel=0x7ffff02e1858, se=0x7fffd42c67e0, + f=32772, ek=...) at /home/aris/sources/monetdb/sql/server/rel_select.c:4923 +#2 0x00007ffff1ead4f0 in rel_value_exp (query=0x7fffd42c6830, rel=0x7ffff02e1858, se=0x7fffd42c67e0, + f=32772, ek=...) at /home/aris/sources/monetdb/sql/server/rel_select.c:5050 +#3 0x00007ffff1f27a6a in rel_psm_call (query=0x7fffd42c6830, se=0x7fffd42c67e0) + at /home/aris/sources/monetdb/sql/server/rel_psm.c:166 +#4 0x00007ffff1f2f5ee in rel_psm (query=0x7fffd42c6830, s=0x7fffd42c6800) + at /home/aris/sources/monetdb/sql/server/rel_psm.c:1576 +#5 0x00007ffff1e91f34 in rel_semantic (query=0x7fffd42c6830, s=0x7fffd42c6800) + at /home/aris/sources/monetdb/sql/server/rel_semantic.c:198 +(gdb) p s->token +$24 = SQL_CALL +#6 0x00007ffff1d3a754 in sql_symbol2relation (be=0x7fffd4222fc0, sym=0x7fffd42c6800) + at /home/aris/sources/monetdb/sql/backends/monet5/sql.c:119 +#7 0x00007ffff1d5d1b4 in SQLparser (c=0x5555557b51c0) + at /home/aris/sources/monetdb/sql/backends/monet5/sql_scenario.c:1074 +#8 0x00007ffff795d01b in runPhase (c=0x5555557b51c0, phase=1) + at /home/aris/sources/monetdb/monetdb5/mal/mal_scenario.c:448 + +mclient doet prepare niet via mapi_prepare maar via een normale mapi_query. +De remote zal dan dit normaal parsen. en geeft in sql_result.c:mvc_export_prepare +de noodzakelijke meta data voor het aanroepen van de prepared statement. +mclient gebruikt + +Plan + +Expand sqlStatementIntern to incorporate prepared statements. + +use remote to call sql.prepare on the remote side. Remote should return similar info as regular mapi. 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 @@ -311,8 +311,12 @@ SQLescapeString(str s) } str -SQLstatementIntern(Client c, str *expr, str nme, bit execute, bit output, res_table **result) +SQLstatementIntern2(Client c, str *expr, str nme, bit prepare, bit execute, bit output, res_table **result); + +str +SQLstatementIntern2(Client c, str *expr, str nme, bit prepare, bit execute, bit output, res_table **result) { + (void) prepare; int status = 0, err = 0, oldvtop, oldstop = 1, inited = 0, ac, sizeframes, topframes; unsigned int label; mvc *o = NULL, *m = NULL; @@ -588,6 +592,12 @@ endofcompile: } str +SQLstatementIntern(Client c, str *expr, str nme, bit execute, bit output, res_table **result) +{ + return SQLstatementIntern2(c, expr, nme, FALSE, execute, output, result); +} + +str SQLengineIntern(Client c, backend *be) { str msg = MAL_SUCCEED; diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c --- a/tools/monetdbe/monetdbe.c +++ b/tools/monetdbe/monetdbe.c @@ -95,6 +95,7 @@ typedef struct { monetdbe_data_time time_null; monetdbe_data_timestamp timestamp_null; Mapi mid; + str mid_sr; } monetdbe_database_internal; typedef struct { @@ -251,7 +252,7 @@ monetdbe_get_results(monetdbe_result** r monetdbe_result_internal* res_internal; if (!(res_internal = GDKzalloc(sizeof(monetdbe_result_internal)))) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_query_internal", MAL_MALLOC_FAIL); + mdbe->msg = createException(MAL, "monetdbe.monetdbe_get_results", MAL_MALLOC_FAIL); return mdbe->msg; } // TODO: set type of result outside. @@ -268,7 +269,7 @@ monetdbe_get_results(monetdbe_result** r be->results = NULL; res_internal->converted_columns = GDKzalloc(sizeof(monetdbe_column*) * res_internal->res.ncols); if (!res_internal->converted_columns) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_query_internal", MAL_MALLOC_FAIL); + mdbe->msg = createException(MAL, "monetdbe.monetdbe_get_results", MAL_MALLOC_FAIL); return mdbe->msg; } } @@ -600,6 +601,74 @@ static bool urls_matches(const char* l, return (l && r && (strcmp(l, r) == 0)) || (l == NULL && r == NULL); } +#include <mal.h> +#include <mal_backend.h> +#include <opt_prelude.h> + +static int +monetdbe_open_remote(monetdbe_database_internal *mdbe, char *url, monetdbe_options *opts) { + + monetdbe_remote* remote = opts->remote; + if (!remote) { + mdbe->msg = createException(MAL, "monetdbe.monetdbe_open_remote", "Missing user credential for monetdbe remote proxy set up"); + return -1; + } + + Client c = mdbe->c; + + assert(!c->curprg); + + const char *mod = "user"; + char nme[16]; + const char *name = number2name(nme, sizeof(nme), ++((backend*) c->sqlcontext)->remote); + c->curprg = newFunction(putName(mod), putName(name), FUNCTIONsymbol); + + if (c->curprg == NULL) { + mdbe->msg = createException(MAL, "monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL); + return -2; + } + + MalBlkPtr mb = c->curprg->def; + + InstrPtr q = getInstrPtr(mb, 0); + q->argc = q->retc = 0; + q = pushReturn(mb, q, newTmpVariable(mb, TYPE_str)); + + InstrPtr p = newFcnCall(mb, remoteRef, connectRef); + p = pushStr(mb, p, url); + p = pushStr(mb, p, remote->username); + p = pushStr(mb, p, remote->password); + p = pushStr(mb, p, "msql"); + + q = newInstruction(mb, NULL, NULL); + q->barrier= RETURNsymbol; + q = pushReturn(mb, q, getArg(p, 0)); + + pushInstruction(mb, q); + + if (p == NULL) { + mdbe->msg = createException(MAL, "monetdbe.monetdbe_open_remote", MAL_MALLOC_FAIL); + return -2; + } + if ( (mdbe->msg = chkProgram(c->usermodule, mb)) != MAL_SUCCEED ) { + return -2; + } + MalStkPtr stk = prepareMALstack(mb, mb->vsize); + stk->keepAlive = TRUE; + if ( (mdbe->msg = runMAL(c, mb, 0, stk)) != MAL_SUCCEED ) { + return -2; + } + mdbe->mid_sr = strdup(*getArgReference_str(stk, p, 0)); + + garbageCollector(c, mb, stk, TRUE); + freeStack(stk); + + printf("yeah a connect string: %s!\n", mdbe->mid_sr); + + + return 0; +} + int monetdbe_open(monetdbe_database *dbhdl, char *url, monetdbe_options *opts) { @@ -618,27 +687,6 @@ monetdbe_open(monetdbe_database *dbhdl, mdbe->c = NULL; bool is_remote = monetdbe_is_remote(url); - - if (is_remote) { - monetdbe_remote* remote = opts->remote; - if (!remote) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", "Missing user credential for monetdbe remote proxy set up"); - return -1; - } - - Mapi mid = mapi_mapiuri(url, remote->username, remote->password, remote->lang); - if (mid == NULL) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", "Cannot initialize mapi object."); - return -2; - } - else if(mapi_reconnect(mid) /* actually, initial connect */, mapi_error(mid)) { - mdbe->msg = createException(MAL, "monetdbe.monetdbe_startup", "%s", mapi_error_str(mid)); - return -2; - } - - mdbe->mid = mid; - } - if (!monetdbe_embedded_initialized) { /* When used as a remote mapi proxy, * it is still necessary to have an initialized monetdbe. E.g. for BAT life cycle management. @@ -653,6 +701,10 @@ monetdbe_open(monetdbe_database *dbhdl, if (!mdbe->msg) res = monetdbe_open_internal(mdbe); + + if (res == 0 && is_remote) + res = monetdbe_open_remote(mdbe, url, opts); + MT_lock_unset(&embedded_lock); if (mdbe->msg) return -2; @@ -796,15 +848,12 @@ monetdbe_in_transaction(monetdbe_databas return result; } -char* -monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows) +static char* +monetdbe_query_external(monetdbe_database_internal *mdbe, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows) { - if (!dbhdl) - return NULL; - monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl; - - if (mdbe->mid) { - if (mapi_set_columnar_protocol(mdbe->mid, true) != MOK || mapi_error(mdbe->mid)) { + // TODO: do something with affected_rows + (void) affected_rows; + if (mapi_set_columnar_protocol(mdbe->mid, true) != MOK || mapi_error(mdbe->mid)) { mdbe->msg = createException(MAL, "monetdbe.connect", "%s", mapi_error_str(mdbe->mid)); return mdbe->msg; } @@ -880,13 +929,48 @@ monetdbe_query(monetdbe_database dbhdl, } return mdbe->msg; +} + +char* +monetdbe_query(monetdbe_database dbhdl, char* query, monetdbe_result** result, monetdbe_cnt* affected_rows) +{ + if (!dbhdl) + return NULL; + monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl; + + if (mdbe->mid) { + mdbe->msg = monetdbe_query_external(mdbe, query, result, affected_rows); } else { mdbe->msg = monetdbe_query_internal(mdbe, query, result, affected_rows, NULL, 'S'); - return mdbe->msg; } + + return mdbe->msg; } + +/* +static +void _remote_execute( + monetdbe_database_internal *mdbe, + char* query, + monetdbe_statement **stmt) { + + Client c = mdbe->c; + MalBlkPtr curBlk = 0; + InstrPtr curInstr = 0, p, o; + + backup = c->curprg; + const char *mod = "user"; + + + c->curprg = newFunction(putName(mod), putName(name), FUNCTIONsymbol); + +} +*/ + + + char* monetdbe_prepare(monetdbe_database dbhdl, char* query, monetdbe_statement **stmt) { @@ -973,9 +1057,13 @@ monetdbe_execute(monetdbe_statement *stm if (!stmt_internal->data[i].vtype) return createException(MAL, "monetdbe.monetdbe_execute", "Parameter %d not bound to a value", i); } - //MalStkPtr glb = (MalStkPtr) (q->stk); - //Symbol s = (Symbol)q->code; - //mdbe->msg = callMAL(mdbe->c, s->def, &glb, stmt_internal->args, 0); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list