Changeset: 9e3e9a593a0b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9e3e9a593a0b
Modified Files:
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.c
        sql/include/sql_catalog.h
        sql/server/rel_schema.c
        sql/server/rel_schema.h
        sql/server/rel_select.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.y
        sql/server/sql_psm.c
        sql/server/sql_scan.c
        sql/storage/store.c
Branch: default
Log Message:

add support for
    CREATE REMOTE table tname ( ... ) ON 'mapi:monetdb://host:port/database';


diffs (truncated from 468 to 300 lines):

diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -1076,6 +1076,54 @@ exit remotewrk;
     return getBid:lng := res;
 end getBid;
 
+function remote.bind{inline}(dbconn:str, sch:str, tab:str,col:str,kind:int, 
+version:int):bat[:oid,:any_1];
+       b:bat[:oid,:any_1] := nil:bat[:oid,:any_1];
+       m := nil:int;
+       conn := remote.connect(dbconn, "monetdb", "monetdb", "msql");
+       rm := remote.put(conn,m);
+       rm := remote.exec(conn,"sql","mvc");
+       s := remote.put(conn,sch);
+       t := remote.put(conn,tab);
+       c := remote.put(conn,col);
+       k := remote.put(conn,kind);
+       bh:= remote.put(conn,b);
+       bh:= remote.exec(conn,"sql","bind",rm,s,t,c,k);
+       b:bat[:oid,:any_1]:= remote.get(conn,bh);
+       return bind:= b;
+end remote.bind;
+
+function remote.bind_idxbat{inline}(dbconn:str, sch:str, tab:str, index:str, 
access:int, version:int):bat[:oid,:oid];
+       b:bat[:oid,:oid] := nil:bat[:oid,:oid];
+       m := nil:int;
+       conn := remote.connect(dbconn, "monetdb", "monetdb", "msql");
+       rm := remote.put(conn,m);
+       rm := remote.exec(conn,"sql","mvc");
+       s := remote.put(conn,sch);
+       t := remote.put(conn,tab);
+       i := remote.put(conn,index);
+       a := remote.put(conn,access);
+       bh:= remote.put(conn,b);
+       bh:= remote.exec(conn,"sql","bind_idxbat",rm,s,t,i,a);
+       b:bat[:oid,:oid]:= remote.get(conn,bh);
+       return bind_idxbat:= b;
+end remote.bind_idxbat;
+
+function remote.bind_dbat{inline}(dbconn:str, sch:str, tab:str, access:int, 
version:int):bat[:oid,:oid];
+       b:bat[:oid,:any_1] := nil:bat[:oid,:any_1];
+       m := nil:int;
+       conn := remote.connect(dbconn, "monetdb", "monetdb", "msql");
+       rm := remote.put(conn,m);
+       rm := remote.exec(conn,"sql","mvc");
+       s := remote.put(conn,sch);
+       t := remote.put(conn,tab);
+       a := remote.put(conn,access);
+       bh:= remote.put(conn,b);
+       bh:= remote.exec(conn,"sql","bind_dbat",rm,s,t,a);
+       b:bat[:oid,:oid]:= remote.get(conn,bh);
+       return bind_dbat:= b;
+end remote.bind_dbat;
+
 pattern rdfshred (location:str, gname:str, schema:str)
 address SQLrdfShred
 comment "Procedure that wraps around the shredder of the rdf module in MAL. 
@@ -1843,7 +1891,7 @@ create_table_or_view( mvc *sql, char *sn
        }
        /* TODO copy triggers */
        /* also create dependencies */
-       if (t->query) {
+       if (t->query && isView(t)) {
                sql_rel *r = NULL;
                sql->sa = sa_create();
                r = rel_parse(sql, t->query, m_deps); 
@@ -1991,7 +2039,7 @@ drop_table(mvc *sql, char *sname, char *
        }
        if (!t) { 
                return sql_message("DROP TABLE: no such table '%s'", tname);
-       } else if (!isTable(t)) {
+       } else if (!isTable(t) && !isStream(t) && !isRemote(t)) {
                return sql_message("DROP TABLE: cannot drop VIEW '%s'", tname);
        } else if (t->system) {
                return sql_message("DROP TABLE: cannot drop system table '%s'", 
tname);
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
@@ -643,44 +643,68 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                case st_bat: {
                        int ht = TYPE_oid;
                        int tt = s->op4.cval->type.type->localtype;
+                       sql_table *t = s->op4.cval->t;
+                       str mod = isRemote(t)?octopusRef:sqlRef;
 
-                       q = newStmt2(mb, sqlRef, bindRef);
+                       q = newStmt2(mb, mod, bindRef);
                        setVarType(mb, getArg(q, 0), newBatType(ht, tt));
                        setVarUDFtype(mb,getArg(q,0));
-                       q = pushArgument(mb, q, sql->mvc_var);
-                       q = pushSchema(mb, q, s->op4.cval->t);
-                       q = pushStr(mb, q, s->op4.cval->t->base.name);
+                       if (isRemote(t))
+                               q = pushStr(mb, q, t->query);
+                       else
+                               q = pushArgument(mb, q, sql->mvc_var);
+                       q = pushSchema(mb, q, t);
+                       q = pushStr(mb, q, t->base.name);
                        q = pushStr(mb, q, s->op4.cval->base.name);
                        q = pushInt(mb, q, s->flag);
+                       /* dummy version */
+                       if (isRemote(t))
+                               q = pushInt(mb, q, s->flag);
                        s->nr = getDestVar(q);
                }
                        break;
                case st_dbat:{
                        int ht = TYPE_oid;
+                       sql_table *t = s->op4.tval;
+                       str mod = isRemote(t)?octopusRef:sqlRef;
 
-                       q = newStmt2(mb, sqlRef, binddbatRef);
+                       q = newStmt2(mb, mod, binddbatRef);
                        setVarType(mb, getArg(q,0), newBatType(ht,TYPE_oid));
                        setVarUDFtype(mb,getArg(q,0));
-                       q = pushArgument(mb, q, sql->mvc_var);
-                       q = pushSchema(mb, q, s->op4.tval);
-                       q = pushStr(mb, q, s->op4.tval->base.name);
+                       if (isRemote(t))
+                               q = pushStr(mb, q, t->query);
+                       else
+                               q = pushArgument(mb, q, sql->mvc_var);
+                       q = pushSchema(mb, q, t);
+                       q = pushStr(mb, q, t->base.name);
                        q = pushInt(mb, q, s->flag);
+                       /* dummy version */
+                       if (isRemote(t))
+                               q = pushInt(mb, q, s->flag);
                        s->nr = getDestVar(q);
                }
                        break;
                case st_idxbat:{
                        int tt;
                        int ht = TYPE_oid;
+                       sql_table *t = s->op4.idxval->t;
+                       str mod = isRemote(t)?octopusRef:sqlRef;
 
-                       q = newStmt2(mb, sqlRef, bindidxRef);
+                       q = newStmt2(mb, mod, bindidxRef);
                        tt = tail_type(s)->type->localtype;
                        setVarType(mb, getArg(q, 0), newBatType(ht, tt));
                        setVarUDFtype(mb,getArg(q,0));
-                       q = pushArgument(mb, q, sql->mvc_var);
-                       q = pushSchema(mb, q, s->op4.idxval->t);
-                       q = pushStr(mb, q, s->op4.idxval->t->base.name);
+                       if (isRemote(t))
+                               q = pushStr(mb, q, t->query);
+                       else
+                               q = pushArgument(mb, q, sql->mvc_var);
+                       q = pushSchema(mb, q, t);
+                       q = pushStr(mb, q, t->base.name);
                        q = pushStr(mb, q, s->op4.idxval->base.name);
                        q = pushInt(mb, q, s->flag);
+                       /* dummy version */
+                       if (isRemote(t))
+                               q = pushInt(mb, q, s->flag);
                        s->nr = getDestVar(q);
                }
                        break;
@@ -1649,8 +1673,9 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                case st_delete:{
                        int r = _dumpstmt(sql, mb, s->op1);
                        sql_table *t = s->op4.tval;
+                       str mod = isRemote(t)?octopusRef:sqlRef;
 
-                       q = newStmt1(mb, sqlRef, "delete");
+                       q = newStmt1(mb, mod, "delete");
                        q = pushArgument(mb, q, sql->mvc_var);
                        getArg(q, 0) = sql->mvc_var= 
newTmpVariable(mb,TYPE_int);
                        q = pushSchema(mb, q, t);
@@ -1660,8 +1685,9 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
                } break;
                case st_table_clear:{
                        sql_table *t = s->op4.tval;
+                       str mod = isRemote(t)?octopusRef:sqlRef;
 
-                       q = newStmt1(mb, sqlRef, "clear_table");
+                       q = newStmt1(mb, mod, "clear_table");
                        q = pushSchema(mb, q, t);
                        q = pushStr(mb, q, t->base.name);
                        s->nr = getDestVar(q);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -107,7 +107,8 @@ typedef enum temp_t {
        SQL_GLOBAL_TEMP,
        SQL_DECLARED_TABLE,     /* variable inside a stored procedure */
        SQL_MERGE_TABLE,
-       SQL_STREAM
+       SQL_STREAM,
+       SQL_REMOTE
 } temp_t;
 
 typedef enum commit_action_t { 
@@ -356,7 +357,8 @@ typedef enum table_types {
        tt_view = 1,            /* view */
        tt_generated = 2,       /* generated (functions can be sql or c-code) */
        tt_merge_table = 3,     /* multiple tables form one table */
-       tt_stream = 4           /* stream */
+       tt_stream = 4,          /* stream */
+       tt_remote = 5           /* stored on a remote server */
 } table_types;
 
 #define isTable(x)     (x->type==tt_table)
@@ -364,6 +366,7 @@ typedef enum table_types {
 #define isGenerated(x)  (x->type==tt_generated)
 #define isMergeTable(x) (x->type==tt_merge_table)
 #define isStream(x)    (x->type==tt_stream)
+#define isRemote(x)    (x->type==tt_remote)
 
 typedef struct sql_table {
        sql_base base;
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -160,7 +160,8 @@ sql_table *
 mvc_create_table_as_subquery( mvc *sql, sql_rel *sq, sql_schema *s, char 
*tname, dlist *column_spec, int temp, int commit_action )
 {
        char *n;
-       int tt = (temp == SQL_STREAM)?tt_stream:
+       int tt =(temp == SQL_REMOTE)?tt_remote:
+               (temp == SQL_STREAM)?tt_stream:
                 ((temp == SQL_MERGE_TABLE)?tt_merge_table:tt_table);
 
        sql_table *t = mvc_create_table(sql, s, tname, tt, 0, 
SQL_DECLARED_TABLE, commit_action, -1);
@@ -763,14 +764,15 @@ table_element(mvc *sql, symbol *s, sql_s
 }
 
 sql_rel *
-rel_create_table(mvc *sql, sql_schema *ss, int temp, char *sname, char *name, 
symbol *table_elements_or_subquery, int commit_action)
+rel_create_table(mvc *sql, sql_schema *ss, int temp, char *sname, char *name, 
symbol *table_elements_or_subquery, int commit_action, char *loc)
 {
        sql_schema *s = NULL;
 
        int instantiate = (sql->emode == m_instantiate);
        int deps = (sql->emode == m_deps);
        int create = (!instantiate && !deps);
-       int tt = (temp == SQL_STREAM)?tt_stream:
+       int tt = (temp == SQL_REMOTE)?tt_remote:
+                (temp == SQL_STREAM)?tt_stream:
                 ((temp == SQL_MERGE_TABLE)?tt_merge_table:tt_table);
 
        (void)create;
@@ -799,7 +801,9 @@ rel_create_table(mvc *sql, sql_schema *s
                return sql_error(sql, 02, "CREATE TABLE: insufficient 
privileges for user '%s' in schema '%s'", stack_get_string(sql, 
"current_user"), s->base.name);
        } else if (table_elements_or_subquery->token == SQL_CREATE_TABLE) { 
                /* table element list */
-               sql_table *t = mvc_create_table(sql, s, name, tt, 0, 
SQL_DECLARED_TABLE, commit_action, -1);
+               sql_table *t = (tt == tt_remote)?
+                       mvc_create_remote(sql, s, name, SQL_DECLARED_TABLE, 
loc):
+                       mvc_create_table(sql, s, name, tt, 0, 
SQL_DECLARED_TABLE, commit_action, -1);
                dnode *n;
                dlist *columns = table_elements_or_subquery->data.lval;
 
@@ -1545,7 +1549,7 @@ rel_schemas(mvc *sql, symbol *s)
 
                assert(l->h->type == type_int);
                assert(l->h->next->next->next->type == type_int);
-               ret = rel_create_table(sql, cur_schema(sql), temp, sname, name, 
l->h->next->next->data.sym, l->h->next->next->next->data.i_val);
+               ret = rel_create_table(sql, cur_schema(sql), temp, sname, name, 
l->h->next->next->data.sym, l->h->next->next->next->data.i_val, 
l->h->next->next->next->next->data.sval);
        }       break;
        case SQL_CREATE_VIEW:
        {
diff --git a/sql/server/rel_schema.h b/sql/server/rel_schema.h
--- a/sql/server/rel_schema.h
+++ b/sql/server/rel_schema.h
@@ -28,7 +28,7 @@
 
 extern sql_rel *rel_schemas(mvc *sql, symbol *sym);
 
-extern sql_rel *rel_create_table(mvc *sql, sql_schema *ss, int temp, char 
*sname, char *name, symbol *table_elements_or_subquery, int commit_action);
+extern sql_rel *rel_create_table(mvc *sql, sql_schema *ss, int temp, char 
*sname, char *name, symbol *table_elements_or_subquery, int commit_action, char 
*loc);
 extern sql_rel *rel_list(sql_allocator *sa, sql_rel *l, sql_rel *r);
 extern sql_table * mvc_create_table_as_subquery( mvc *sql, sql_rel *sq, 
sql_schema *s, char *tname, dlist *column_spec, int temp, int commit_action );
 
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -329,7 +329,6 @@ rel_bind_path(sql_rel *rel, sql_exp *e )
        return path;
 }
 
-
 list *
 rel_projections(mvc *sql, sql_rel *rel, char *tname, int settname, int intern )
 {
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -991,6 +991,24 @@ mvc_create_view(mvc *m, sql_schema *s, c
 }
 
 sql_table *
+mvc_create_remote(mvc *m, sql_schema *s, char *name, int persistence, char 
*loc)
+{
+       sql_table *t = NULL;
+
+       if (mvc_debug)
+               fprintf(stderr, "#mvc_create_remote %s %s %s\n", s->base.name, 
name, loc);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to