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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list