Changeset: 34f6b86ff27b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=34f6b86ff27b
Modified Files:
        sql/backends/monet5/sql_gencode.c
Branch: headless
Log Message:

Merge with default branch.


diffs (truncated from 411 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -516,6 +516,7 @@ MapiMsg mapi_quick_response(MapiHdl hdl,
 char *mapi_quote(const char *msg, int size);
 MapiMsg mapi_read_response(MapiHdl hdl);
 MapiMsg mapi_reconnect(Mapi mid);
+MapiMsg mapi_release_id(Mapi mid, int id);
 char **mapi_resolve(const char *host, int port, const char *pattern);
 char *mapi_result_error(MapiHdl hdl);
 mapi_int64 mapi_rows_affected(MapiHdl hdl);
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -3058,11 +3058,13 @@ mapi_timeout(Mapi mid, int timeout)
 }
 
 static MapiMsg
-mapi_Xcommand(Mapi mid, char *cmdname, char *cmdvalue)
+mapi_Xcommand(Mapi mid, const char *cmdname, const char *cmdvalue)
 {
        MapiHdl hdl;
 
        mapi_check(mid, "mapi_Xcommand");
+       if (mid->active && read_into_cache(mid->active, 0) != MOK)
+               return MERROR;
        if (mnstr_printf(mid->to, "X" "%s %s\n", cmdname, cmdvalue) < 0 ||
            mnstr_flush(mid->to)) {
                close_connection(mid);
@@ -3410,7 +3412,7 @@ MapiMsg
 mapi_set_size_header(Mapi mid, int value)
 {
        if (mid->languageId != LANG_SQL) {
-               mapi_setError(mid, "size header only supported in SQL", 
"mapi_toggle_size_header", MERROR);
+               mapi_setError(mid, "size header only supported in SQL", 
"mapi_set_size_header", MERROR);
                return MERROR;
        }
        if (value)
@@ -3420,6 +3422,19 @@ mapi_set_size_header(Mapi mid, int value
 }
 
 MapiMsg
+mapi_release_id(Mapi mid, int id)
+{
+       char buf[10];
+
+       if (mid->languageId != LANG_SQL) {
+               mapi_setError(mid, "release only supported in SQL", 
"mapi_release_id", MERROR);
+               return MERROR;
+       }
+       snprintf(buf, sizeof(buf), "%d", id);
+       return mapi_Xcommand(mid, "release", buf);
+}
+
+MapiMsg
 mapi_trace(Mapi mid, int flag)
 {
        mapi_clrError(mid);
diff --git a/clients/mapilib/mapi.h b/clients/mapilib/mapi.h
--- a/clients/mapilib/mapi.h
+++ b/clients/mapilib/mapi.h
@@ -166,6 +166,7 @@ mapi_export int mapi_get_autocommit(Mapi
 mapi_export MapiMsg mapi_log(Mapi mid, const char *nme);
 mapi_export MapiMsg mapi_setAutocommit(Mapi mid, int autocommit);
 mapi_export MapiMsg mapi_set_size_header(Mapi mid, int value);
+mapi_export MapiMsg mapi_release_id(Mapi mid, int id);
 mapi_export char *mapi_result_error(MapiHdl hdl);
 mapi_export MapiMsg mapi_next_result(MapiHdl hdl);
 mapi_export MapiMsg mapi_needmore(MapiHdl hdl);
diff --git a/clients/odbc/driver/SQLEndTran.c b/clients/odbc/driver/SQLEndTran.c
--- a/clients/odbc/driver/SQLEndTran.c
+++ b/clients/odbc/driver/SQLEndTran.c
@@ -158,7 +158,7 @@ SQLEndTran_(SQLSMALLINT HandleType,
                                    nativeErrCode);
                }
                /* clean up the statement handle */
-               SQLFreeStmt_(stmt, SQL_CLOSE);
+               ODBCResetStmt(stmt);
                ODBCFreeStmt_(stmt);
 
                for (stmt = dbc->FirstStmt; stmt; stmt = stmt->next)
diff --git a/clients/odbc/driver/SQLExecute.c b/clients/odbc/driver/SQLExecute.c
--- a/clients/odbc/driver/SQLExecute.c
+++ b/clients/odbc/driver/SQLExecute.c
@@ -392,7 +392,7 @@ SQLExecute_(ODBCStmt *stmt)
        }
 
        /* internal state correctness checks */
-       assert(stmt->ImplRowDescr->descRec != NULL);
+       assert(stmt->State == PREPARED0 || stmt->State == EXECUTED0 || 
stmt->ImplRowDescr->descRec != NULL);
 
        assert(stmt->Dbc);
        assert(stmt->Dbc->mid);
diff --git a/clients/odbc/driver/SQLPrepare.c b/clients/odbc/driver/SQLPrepare.c
--- a/clients/odbc/driver/SQLPrepare.c
+++ b/clients/odbc/driver/SQLPrepare.c
@@ -47,6 +47,8 @@ ODBCResetStmt(ODBCStmt *stmt)
        SQLFreeStmt_(stmt, SQL_CLOSE);
        setODBCDescRecCount(stmt->ImplParamDescr, 0);
 
+       if (stmt->queryid >= 0)
+               mapi_release_id(stmt->Dbc->mid, stmt->queryid);
        stmt->queryid = -1;
        stmt->nparams = 0;
        stmt->State = INITED;
@@ -133,7 +135,7 @@ SQLPrepare_(ODBCStmt *stmt,
 
                mapi_fetch_row(hdl);
                s = mapi_fetch_field(hdl, 5); /* column name: null -> param */
-               if (s == NULL) {
+               if (s == NULL || *s == 0) {
                        stmt->nparams++;
                        rec = prec++;
                        rec->sql_desc_nullable = SQL_NULLABLE;
diff --git a/sql/backends/monet5/datacell/actuator.c 
b/sql/backends/monet5/datacell/actuator.c
--- a/sql/backends/monet5/datacell/actuator.c
+++ b/sql/backends/monet5/datacell/actuator.c
@@ -112,7 +112,7 @@ usage(void)
        mnstr_printf(ACout, "\nactuator [options]\n");
        mnstr_printf(ACout, "--host=<host name>, default localhost\n");
        mnstr_printf(ACout, "--port=<portnr>, default 50600 \n");
-       mnstr_printf(ACout, "--protocol=<name>  either tpc/udp\n");
+       mnstr_printf(ACout, "--protocol=<name>  either tcp/udp\n");
        mnstr_printf(ACout, "--actuator=<actuator name> to identify the event 
received \n");
     mnstr_printf(ACout, "--active run as a active listener \n");
     mnstr_printf(ACout, "--passive run as a passive listener (default)\n");
diff --git a/sql/backends/monet5/datacell/datacell.c 
b/sql/backends/monet5/datacell/datacell.c
--- a/sql/backends/monet5/datacell/datacell.c
+++ b/sql/backends/monet5/datacell/datacell.c
@@ -177,7 +177,7 @@ DCresumeObject(Client cntxt, MalBlkPtr m
 
        idx = BSKTlocate(tbl);
        if ( idx == 0)
-               throw(SQL, "datacell.pause", "Basket not found");
+               throw(SQL, "datacell.resume", "Basket not found");
 
        DCreceptorResume(&ret, &tbl);
        DCemitterResume(&ret, &tbl);
diff --git a/sql/backends/monet5/datacell/datacell.mal 
b/sql/backends/monet5/datacell/datacell.mal
--- a/sql/backends/monet5/datacell/datacell.mal
+++ b/sql/backends/monet5/datacell/datacell.mal
@@ -51,7 +51,7 @@ comment "Pause a receptor or emitter";
 
 pattern resume(obj:str):void
 address DCresumeObject
-comment "Pause a receptor or emitter";
+comment "(Re)start a receptor or emitter";
 
 pattern query(name:str,def:str):void
 address DCquery
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -48,6 +48,7 @@
 #include "mal_builder.h"
 
 #include <sql_rel2bin.h>
+#include <rel_select.h>
 #include <rel_optimizer.h>
 #include <rel_subquery.h>
 #include <rel_prop.h>
@@ -240,14 +241,16 @@ table_func_create_result( MalBlkPtr mb, 
 }
 
 static InstrPtr
-relational_func_create_result( MalBlkPtr mb, InstrPtr q, sql_rel *f)
+relational_func_create_result( mvc *sql, MalBlkPtr mb, InstrPtr q, sql_rel *f)
 {
        sql_rel *r = f;
        node *n;
        int i;
 
-       if (is_topn(f->op))
-               r = f->l;
+       if (is_topn(r->op))
+               r = r->l;
+       if (!is_project(r->op))
+               r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 
1));
        q->argc = q->retc = 0;
        for (i = 0, n = r->exps->h; n; n = n->next, i++ ) {
                sql_exp *e = n->data;
@@ -294,7 +297,7 @@ _create_relational_function(mvc *m, char
        curBlk = c->curprg->def;
        curInstr = getInstrPtr(curBlk, 0);
 
-       curInstr = relational_func_create_result(curBlk, curInstr, rel);
+       curInstr = relational_func_create_result(m, curBlk, curInstr, r);
        setVarUDFtype(curBlk,0);
 
        /* ops */
@@ -334,13 +337,16 @@ _create_relational_remote(mvc *m, char *
        char *uri = prp->value;
        node *n;
        int i, q, v;
-       int *lret = SA_NEW_ARRAY(m->sa, int, list_length(rel->exps));
-       int *rret = SA_NEW_ARRAY(m->sa, int, list_length(rel->exps));
+       int *lret, *rret;
        char old = name[0];
        sql_rel *r = rel;
 
        if (is_topn(r->op))
-               r = rel->l;
+               r = r->l;
+       if (!is_project(r->op))
+               r = rel_project(m->sa, r, rel_projections(m, r, NULL, 1, 1));
+       lret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps));
+       rret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps));
        /* dirty hack, rename (change first char of name) L->l, local
          * functions name start with 'l'        */ 
        name[0] = 'l';
@@ -354,7 +360,7 @@ _create_relational_remote(mvc *m, char *
        curBlk = c->curprg->def;
        curInstr = getInstrPtr(curBlk, 0);
 
-       curInstr = relational_func_create_result(curBlk, curInstr, rel);
+       curInstr = relational_func_create_result(m, curBlk, curInstr, rel);
        setVarUDFtype(curBlk,0);
 
        /* ops */
@@ -1749,7 +1755,7 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                        monet5_create_relational_function(sql->mvc, fimp, rel, 
s);
 
                        q = newStmt(mb, mod, fimp);
-                       q = relational_func_create_result(mb, q, rel);
+                       q = relational_func_create_result(sql->mvc, mb, q, rel);
                        if (s->op1)
                                for (n = s->op1->op4.lval->h; n; n = n->next) {
                                        stmt *op = n->data;
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -29,6 +29,23 @@
 #include "rel_updates.h"
 #include "sql_env.h"
 
+
+static sql_rel *
+rewrite_replica( mvc *sql, sql_rel *rel, sql_table *t, sql_table *p) 
+{
+       node *n, *m;
+       sql_rel *r = rel_basetable(sql, p, t->base.name);
+
+       for (n = rel->exps->h, m = r->exps->h; n && m; n = n->next, m = 
m->next) {
+               sql_exp *e = n->data;
+               sql_exp *ne = m->data;
+
+               exp_setname(sql->sa, ne, e->rname, e->name);
+       }
+       rel_destroy(rel);
+       return r;
+}
+
 static sql_rel *
 replica(mvc *sql, sql_rel *rel, char *uri) 
 {
@@ -38,6 +55,8 @@ replica(mvc *sql, sql_rel *rel, char *ur
        if (rel_is_ref(rel)) {
                sql_rel *nrel = rel_copy(sql->sa, rel);
 
+               if (nrel && rel->p)
+                       nrel->p = prop_copy(sql->sa, rel->p);
                rel_destroy(rel);
                rel = nrel;
        }
@@ -48,22 +67,19 @@ replica(mvc *sql, sql_rel *rel, char *ur
                if (isReplicaTable(t)) {
                        node *n;
 
-                       /* replace by the replica which matches the uri */
-                       for (n = t->tables.set->h; n; n = n->next) {
-                               sql_table *p = n->data;
-
-                               if (isRemote(p) && strcmp(uri, p->query) == 0){
-                                       node *n, *m;
-                                       sql_rel *r = rel_basetable(sql, p, 
t->base.name);
-                                       for (n = rel->exps->h, m = r->exps->h; 
n && m; n = n->next, m = m->next) {
-                                               sql_exp *e = n->data;
-                                               sql_exp *ne = m->data;
-
-                                               exp_setname(sql->sa, ne, 
e->rname, e->name);
+                       if (uri) {
+                               /* replace by the replica which matches the uri 
*/
+                               for (n = t->tables.set->h; n; n = n->next) {
+                                       sql_table *p = n->data;
+       
+                                       if (isRemote(p) && strcmp(uri, 
p->query) == 0) {
+                                               rel = rewrite_replica(sql, rel, 
t, p);
+                                               break;
                                        }
-                                       rel_destroy(rel);
-                                       rel = r;
                                }
+                       } else { /* no match, use first */
+                               sql_table *p = t->tables.set->h->data;
+                               rel = rewrite_replica(sql, rel, t, p);
                        }
                }
        }
@@ -113,6 +129,15 @@ distribute(mvc *sql, sql_rel *rel)
        if (!rel)
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to