Update of /cvsroot/monetdb/sql/src/server
In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv26162/src/server
Modified Files:
rel_bin.mx rel_dump.mx rel_optimizer.mx rel_schema.mx
rel_select.mx sql_mvc.mx sql_parser.mx sql_privileges.mx
sql_psm.mx
Log Message:
add basket support
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.172
retrieving revision 1.173
diff -u -d -r1.172 -r1.173
--- rel_select.mx 23 Mar 2010 19:17:22 -0000 1.172
+++ rel_select.mx 26 Apr 2010 19:27:30 -0000 1.173
@@ -25,6 +25,7 @@
#include "rel_semantic.h"
#include "sql_semantic.h"
+#include "rel_subquery.h"
extern sql_rel* rel_create(void);
extern sql_rel* rel_setop(sql_rel *l, sql_rel *r, operator_type setop);
@@ -89,6 +90,7 @@
#include "rel_xml.h"
#include "rel_dump.h"
#include "rel_prop.h"
+#include "rel_schema.h"
#include "rel_sequence.h"
#define rel_groupby_gbe(r,e) rel_groupby(r, append(new_exp_list(), e))
@@ -1269,9 +1271,8 @@
return NULL;
}
-
static sql_rel *
-rel_table_func_named(mvc *sql, sql_rel *rel, symbol *query)
+rel_named_table_function(mvc *sql, sql_rel *rel, symbol *query)
{
list *exps = NULL;
sql_subtype *st = NULL;
@@ -1301,6 +1302,75 @@
return rel_table_func(e, exps);
}
+static sql_exp *
+rel_op_(mvc *sql, sql_schema *s, char *fname, exp_kind ek)
+{
+ sql_subfunc *f = NULL;
+
+ f = sql_bind_func(s, fname, NULL, NULL);
+ if (f && (ek.card == card_relation || !f->res.comp_type)) {
+ return exp_op(NULL, f);
+ } else {
+ return sql_error(sql, 02,
+ "SELECT: no such operator '%s'", fname);
+ }
+}
+
+/* special class of table returning function, but with a table input as well */
+static sql_rel *
+rel_named_table_operator(mvc *sql, sql_rel *rel, symbol *query)
+{
+ exp_kind ek = {type_value, card_relation, TRUE};
+ sql_rel *sq = rel_subquery(sql, rel, query->data.lval->h->data.sym, ek);
+ sql_table *t;
+ sql_func *f;
+ sql_subfunc *sf;
+ sql_exp *e;
+ list *exps;
+ dlist *column_spec = NULL;
+ node *m;
+ int nr = ++sql->label;
+ char *tname = NULL, name[16], *nme;
+
+ nme = number2name(name, 16, nr);
+
+ if (query->data.lval->h->next->data.sym) {
+ tname =
query->data.lval->h->next->data.sym->data.lval->h->data.sval;
+ column_spec =
query->data.lval->h->next->data.sym->data.lval->h->next->data.lval;
+ }
+
+ if ((t = mvc_create_table_as_subquery(sql, sq, sql->session->schema,
tname, column_spec, tt_stream, CA_COMMIT)) == NULL) {
+ rel_destroy(sq);
+ return NULL;
+ }
+ backend_create_function(sql, nme, sq, t);
+
+ f = NEW(sql_func);
+ base_init(&f->base, store_next_oid(), TR_OLD, nme);
+ f->mod = strdup("user");
+ f->imp = strdup(nme);
+ f->ops = NULL;
+ f->res = *sql_bind_localtype("bat");
+ f->res.comp_type = t;
+ f->nr = 0;
+ f->sql = 0;
+ f->aggr = 0;
+ f->side_effect = 0;
+ f->fix_scale = 0;
+ f->s = NULL;
+ sf = NEW(sql_subfunc);
+ sql_ref_init(&(sf->ref));
+ sf->func = f;
+ sf->res = f->res;
+ e = exp_op(NULL, sf);
+ exps = new_exp_list();
+ for (m = t->columns.set->h; m; m = m->next) {
+ sql_column *c = m->data;
+ append(exps, exp_column(tname, c->base.name, &c->type,
CARD_MULTI, c->null, 0));
+ }
+ return rel_table_func(e, exps);
+}
+
static sql_rel *
rel_values( mvc *sql, symbol *tableref)
{
@@ -1432,7 +1502,9 @@
} else if (tableref->token == SQL_VALUES) {
return rel_values(sql, tableref);
} else if (tableref->token == SQL_TABLE) {
- return rel_table_func_named(sql, rel, tableref);
+ return rel_named_table_function(sql, rel, tableref);
+ } else if (tableref->token == SQL_TABLE_OPERATOR) {
+ return rel_named_table_operator(sql, rel, tableref);
} else if (tableref->token == SQL_SELECT) {
return rel_subquery_optname(sql, rel, tableref);
} else {
@@ -2896,20 +2968,13 @@
rel_op(mvc *sql, symbol *se, exp_kind ek )
{
dnode *l = se->data.lval->h;
- sql_subfunc *f = NULL;
char *fname = qname_fname(l->data.lval);
char *sname = qname_schema(l->data.lval);
sql_schema *s = sql->session->schema;
if (sname)
s = mvc_bind_schema(sql, sname);
- f = sql_bind_func(s, fname, NULL, NULL);
- if (f && (ek.card == card_relation || !f->res.comp_type)) {
- return exp_op(NULL, f);
- } else {
- return sql_error(sql, 02,
- "SELECT: no such operator '%s'", fname);
- }
+ return rel_op_(sql, s, fname, ek);
}
sql_exp *
Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- rel_optimizer.mx 31 Jan 2010 12:44:46 -0000 1.84
+++ rel_optimizer.mx 26 Apr 2010 19:27:30 -0000 1.85
@@ -1668,7 +1668,7 @@
static sql_rel *
-rel_cse(int *changes, mvc *sql, sql_rel *rel)
+rel_select_cse(int *changes, mvc *sql, sql_rel *rel)
{
(void)sql;
if (rel->op == op_select && !rel_is_ref(rel) && rel->exps) {
@@ -1692,6 +1692,34 @@
return rel;
}
+static sql_rel *
+rel_project_cse(int *changes, mvc *sql, sql_rel *rel)
+{
+ (void)changes;
+ (void)sql;
+ if (rel->op == op_project && !rel_is_ref(rel) && rel->exps) {
+ list *nexps = new_exp_list();
+ node *n, *m;
+
+ for (n=rel->exps->h; n; n = n->next) {
+ sql_exp *e1 = n->data;
+
+ if (e1->type != e_column) {
+ for (m=n->next; m; m = m->next){
+ sql_exp *e2 = n->data;
+
+ if (exp_match_exp(e1, e2)) {
+ assert(0);
+ }
+ }
+ }
+ }
+ list_destroy(rel->exps);
+ rel->exps = nexps;
+ }
+ return rel;
+}
+
static list *
exps_merge_rse( list *l, list *r )
{
@@ -3461,13 +3489,15 @@
if (gp.cnt[op_union]) {
rel = rewrite(sql, rel, &rel_merge_union);
- rel = rewrite(sql, rel, &rel_cse);
+ rel = rewrite(sql, rel, &rel_select_cse);
rel = rewrite(sql, rel, &rel_merge_rse);
}
/* Remove unused expressions */
- if (gp.cnt[op_project])
+ if (gp.cnt[op_project]) {
rel = rel_dce(sql, rel);
+ //rel = rewrite(sql, rel, &rel_project_cse);
+ }
/* push (simple renaming) projections up */
if (gp.cnt[op_project])
Index: rel_dump.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_dump.mx,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- rel_dump.mx 10 Jan 2010 15:33:34 -0000 1.46
+++ rel_dump.mx 26 Apr 2010 19:27:30 -0000 1.47
@@ -102,7 +102,9 @@
atom *a = e->l;
if (atom_type(a)->type->localtype == TYPE_ptr) {
sql_table *t = a->data.val.pval;
- stream_printf(fout, "table(%s)", t->base.name);
+ stream_printf(fout, "%s(%s)",
+ isStream(t)?"stream":"table",
+ t->base.name);
} else {
char *s = atom2string(a);
if (atom_type(a)->type->localtype == TYPE_str)
@@ -279,10 +281,13 @@
sql_table *t = rel->l;
print_indent(sql, fout, depth);
if (t->s)
- stream_printf(fout, "table(%s.%s)",
+ stream_printf(fout, "%s(%s.%s)",
+ isStream(t)?"stream":"table",
t->s->base.name, t->base.name);
else
- stream_printf(fout, "table(%s)", t->base.name);
+ stream_printf(fout, "%s(%s)",
+ isStream(t)?"stream":"table",
+ t->base.name);
if (rel->exps)
exps_print(sql, fout, rel->exps, depth, 1, 0);
} break;
Index: sql_mvc.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_mvc.mx,v
retrieving revision 1.235
retrieving revision 1.236
diff -u -d -r1.235 -r1.236
--- sql_mvc.mx 27 Feb 2010 19:28:07 -0000 1.235
+++ sql_mvc.mx 26 Apr 2010 19:27:30 -0000 1.236
@@ -181,7 +181,7 @@
extern sql_schema *mvc_create_schema(mvc *m, char *name, int auth_id, int
owner);
extern BUN mvc_clear_table(mvc *m, sql_table *t);
extern void mvc_drop_table(mvc *c, sql_schema *s, sql_table * t, int
drop_action);
-extern sql_table *mvc_create_table(mvc *c, sql_schema *s, char *name, bit
system, int persistence, int commit_action, int sz);
+extern sql_table *mvc_create_table(mvc *c, sql_schema *s, char *name, int tt,
bit system, int persistence, int commit_action, int sz);
extern sql_table *mvc_create_cluster(mvc *c, sql_schema *s, char *name, bit
system, int persistence, int commit_action, int sz);
extern sql_table *mvc_create_view(mvc *c, sql_schema *s, char *name, int
persistence, char *sql, bit system);
extern sql_table *mvc_create_generated(mvc *c, sql_schema *s, char *name, char
*sql, bit system);
@@ -1178,19 +1178,19 @@
sql_table *
-mvc_create_table(mvc *m, sql_schema *s, char *name, bit system, int
persistence, int commit_action, int sz)
+mvc_create_table(mvc *m, sql_schema *s, char *name, int tt, bit system, int
persistence, int commit_action, int sz)
{
sql_table *t = NULL;
if (mvc_debug)
- fprintf(stderr, "mvc_create_table %s %s %d %d %d\n",
s->base.name, name, system, persistence, commit_action);
+ fprintf(stderr, "mvc_create_table %s %s %d %d %d %d\n",
s->base.name, name, tt, system, persistence, commit_action);
if (persistence == SQL_DECLARED_TABLE) {
/* declared tables should not end up in the catalog */
- t = create_sql_table(m->sa, name, tt_table, system,
persistence, commit_action);
+ t = create_sql_table(m->sa, name, tt, system, persistence,
commit_action);
t->s = s;
} else {
- t = sql_trans_create_table(m->session->tr, s, name, NULL,
tt_table, system, persistence, commit_action, sz);
+ t = sql_trans_create_table(m->session->tr, s, name, NULL, tt,
system, persistence, commit_action, sz);
}
return t;
}
Index: sql_privileges.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_privileges.mx,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -d -r1.70 -r1.71
--- sql_privileges.mx 7 Jan 2010 15:24:32 -0000 1.70
+++ sql_privileges.mx 26 Apr 2010 19:27:30 -0000 1.71
@@ -384,7 +384,7 @@
backend_create_privileges(m, s);
- t = mvc_create_table(m, s, "user_role", 1, SQL_PERSIST, 0, -1);
+ t = mvc_create_table(m, s, "user_role", tt_table, 1, SQL_PERSIST, 0,
-1);
mvc_create_column_(m, t, "login_id", "int", 32);
mvc_create_column_(m, t, "role_id", "int", 32);
/*
@@ -393,12 +393,12 @@
*/
/* all roles and users are in the auths table */
- t = mvc_create_table(m, s, "auths", 1, SQL_PERSIST, 0, -1);
+ t = mvc_create_table(m, s, "auths", tt_table, 1, SQL_PERSIST, 0, -1);
mvc_create_column_(m, t, "id", "int", 32);
mvc_create_column_(m, t, "name", "varchar", 1024);
mvc_create_column_(m, t, "grantor", "int", 32);
- t = mvc_create_table(m, s, "privileges", 1, SQL_PERSIST, 0, -1);
+ t = mvc_create_table(m, s, "privileges", tt_table, 1, SQL_PERSIST, 0,
-1);
mvc_create_column_(m, t, "obj_id", "int", 32);
mvc_create_column_(m, t, "auth_id", "int", 32);
mvc_create_column_(m, t, "privileges", "int", 32);
Index: rel_schema.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_schema.mx,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- rel_schema.mx 27 Feb 2010 19:27:59 -0000 1.4
+++ rel_schema.mx 26 Apr 2010 19:27:30 -0000 1.5
@@ -33,6 +33,7 @@
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_list( 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 );
#endif /*_REL_SCHEMA_H_*/
@c
@@ -163,6 +164,23 @@
return NULL;
}
+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_table:tt_stream;
+
+ sql_table *t = mvc_create_table(sql, s, tname, tt, 0,
SQL_DECLARED_TABLE, commit_action, -1);
+ if ((n = as_subquery( sql, t, sq, column_spec)) != NULL) {
+ sql_error(sql, 01, "CREATE TABLE: duplicate column name %s", n);
+
+ table_destroy(t);
+ return NULL;
+ }
+ return t;
+}
+
+
static char *
table_constraint_name(symbol *s, sql_table *t)
{
@@ -756,7 +774,7 @@
if (sname && !(s = mvc_bind_schema(sql, sname)))
return sql_error(sql, 02, "CREATE TABLE: no such schema '%s'",
sname);
- if (temp != SQL_PERSIST && commit_action == CA_COMMIT)
+ if (temp != SQL_PERSIST && temp != SQL_STREAM && commit_action ==
CA_COMMIT)
commit_action = CA_DELETE;
if (temp != SQL_DECLARED_TABLE) {
@@ -777,7 +795,8 @@
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, 0,
SQL_DECLARED_TABLE, commit_action, -1);
+ int tt = (temp != SQL_STREAM)?tt_table:tt_stream;
+ sql_table *t = mvc_create_table(sql, s, name, tt, 0,
SQL_DECLARED_TABLE, commit_action, -1);
dnode *n;
dlist *columns = table_elements_or_subquery->data.lval;
@@ -788,6 +807,7 @@
if (res == SQL_ERR)
return NULL;
}
+ temp = (temp == SQL_STREAM)?SQL_PERSIST:temp;
return rel_table( DDL_CREATE_TABLE, sname, t, temp);
} else { /* [col name list] as subquery with or without data */
sql_rel *sq = NULL, *res = NULL;
@@ -803,18 +823,13 @@
return NULL;
/* create table */
- if (create) {
- char *n;
-
- t = mvc_create_table(sql, s, name, 0,
SQL_DECLARED_TABLE, commit_action, -1);
- if ((n = as_subquery( sql, t, sq, column_spec)) !=
NULL) {
- sql_error(sql, 01, "CREATE TABLE: duplicate
column name %s", n);
- rel_destroy(sq);
- return NULL;
- }
+ if (create && (t = mvc_create_table_as_subquery( sql, sq, s,
name, column_spec, temp, commit_action)) == NULL) {
+ rel_destroy(sq);
+ return NULL;
}
/* insert query result into this table */
+ temp = (temp == SQL_STREAM)?SQL_PERSIST:temp;
res = rel_table( DDL_CREATE_TABLE, sname, t, temp);
if (with_data) {
res = rel_insert(res, sq);
Index: sql_psm.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_psm.mx,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -d -r1.77 -r1.78
--- sql_psm.mx 9 Apr 2010 09:50:33 -0000 1.77
+++ sql_psm.mx 26 Apr 2010 19:27:30 -0000 1.78
@@ -634,7 +634,7 @@
} else {
char *fmod = qname_module(ext_name);
char *fnme = qname_fname(ext_name);
- mvc_create_func(sql, sql->session->schema,
fname, l, restype, FALSE, is_aggr, fmod, fnme, is_func );
+ mvc_create_func(sql, sql->session->schema,
fname, l, restype, FALSE, is_aggr, fmod, fnme, is_func);
sql_destroy_params(sql);
list_destroy(l);
}
Index: sql_parser.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_parser.mx,v
retrieving revision 1.333
retrieving revision 1.334
diff -u -d -r1.333 -r1.334
--- sql_parser.mx 23 Mar 2010 19:17:22 -0000 1.333
+++ sql_parser.mx 26 Apr 2010 19:27:30 -0000 1.334
@@ -73,6 +73,7 @@
SQL_CHARSET,
SQL_SCHEMA,
SQL_TABLE,
+ SQL_TABLE_OPERATOR,
SQL_TYPE,
SQL_CASE,
SQL_CAST,
@@ -777,7 +778,7 @@
m->scanner.as = m->scanner.yycur;
m->scanner.key = 0;
}
- sql SCOLON { mvc *m = (mvc*)parm;
+ sql SCOLON { mvc *m = (mvc*)parm;
if (m->sym) {
append_symbol(m->sym->data.lval, $3);
$$ = m->sym;
@@ -1469,7 +1470,7 @@
;
opt_on_commit: /* only for temporary tables */
- /* empty */ { $$ = CA_DELETE; }
+ /* empty */ { $$ = CA_COMMIT; }
| ON COMMIT sqlDELETE ROWS { $$ = CA_DELETE; }
| ON COMMIT PRESERVE ROWS { $$ = CA_PRESERVE; }
| ON COMMIT DROP { $$ = CA_DROP; }
@@ -3047,17 +3048,11 @@
/* Basket expression, TODO window */
| '[' select_no_parens ']' table_name
{
- dlist *basket_table_func = L();
- dlist *basket_func = L();
- dlist *basket_func_name = append_string(L(), "basket");
- dlist *arg_list = L();
-
- append_list(basket_func, basket_func_name);
- append_list(basket_func, append_symbol(arg_list, $2));
+ dlist *op = L();
- append_symbol(basket_table_func, _symbol_create_list( SQL_NOP,
basket_func ));
- append_symbol(basket_table_func, $4);
- $$ = _symbol_create_list(SQL_TABLE, basket_table_func);
+ append_symbol(op, $2);
+ append_symbol(op, $4);
+ $$ = _symbol_create_list(SQL_TABLE_OPERATOR, op);
}
;
Index: rel_bin.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_bin.mx,v
retrieving revision 1.112
retrieving revision 1.113
diff -u -d -r1.112 -r1.113
--- rel_bin.mx 23 Mar 2010 19:17:21 -0000 1.112
+++ rel_bin.mx 26 Apr 2010 19:27:30 -0000 1.113
@@ -2340,7 +2340,7 @@
n = stmt_unop(n, isnil);
n = stmt_uselect(n, stmt_bool(1), cmp_equal);
if (cur)
- cur = stmt_semijoin(cur, n);
+ cur = stmt_union(stmt_diff(cur,
stmt_dup(n)), n);
else
cur = n;
}
------------------------------------------------------------------------------
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins