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