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

Reply via email to