Changeset: ec23be7becb7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ec23be7becb7
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/rel_tvtree.c
        sql/backends/monet5/rel_tvtree.h
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/sql_parser.y
        sql/server/sql_tokens.h
        sql/server/sqlparse.c
        sql/test/nested/Tests/vector_basic.test
Branch: nested
Log Message:

add SQL_VECTOR token and remove vector in tv_tree


diffs (truncated from 314 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1741,6 +1741,70 @@ is_const_func(sql_subfunc *f, list *attr
        return false;
 }
 
+typedef struct vec_dim {
+       int index;
+       sql_subtype *t;
+       list *vals;
+} vec_dim;
+
+static vec_dim*
+vec_values(backend *be, sql_exp *exp, stmt *left, stmt *sel, vec_dim *acc, 
size_t dim)
+{
+       sql_subtype *t = exp_subtype(exp);
+       assert(t->multiset == MS_VECTOR);
+       list *vals = exp_get_values(exp);
+       if (!vals)
+               return acc;
+       size_t i = 0;
+       for (node *n = vals->h; n; n = n->next, i++) {
+               sql_exp *e = n->data;
+               sql_subtype *t = exp_subtype(e);
+               if (t->multiset == MS_VECTOR)
+                       acc = vec_values(be, e, left, sel, acc, dim);
+               else {
+                       stmt *s = exp_bin(be, e, left, NULL, NULL, NULL, NULL, 
sel, 0, 0, 0);
+                       vec_dim d = acc[i];
+                       if (!d.t)
+                               d.t = t;
+                       if (d.index < 0)
+                               d.index = i;
+                       if (i < dim && d.vals)
+                               list_append(d.vals, s);
+                       acc[i] = d;
+               }
+       }
+       return acc;
+}
+
+static stmt*
+exp2stmt_vector(backend *be, sql_exp *e, stmt *left, stmt *sel)
+{
+       sql_subtype *t = exp_subtype(e);
+       assert(t->multiset == MS_VECTOR);
+       unsigned int ndim = t->digits;
+       vec_dim *vals = ma_alloc(be->mvc->sa, sizeof(vec_dim) * ndim);
+       if (!vals)
+               return NULL;
+       for (size_t i=0; i < ndim; i++) {
+               list *l = sa_list(be->mvc->sa);
+               vals[i] = (vec_dim) {
+                       .index = -1,
+                       .vals = l
+               };
+       }
+       vals = vec_values(be, e, left, sel, vals, ndim);
+       list *l = sa_list(be->mvc->sa);
+       for (size_t i = 0; i < ndim; i++) {
+               vec_dim d = vals[i];
+               stmt *s = stmt_append_bulk(be, stmt_temp(be, d.t), d.vals);
+               list_append(l, s);
+       }
+       stmt *s = stmt_list(be, l);
+       s->nested = true;
+       s->subtype = *t;
+       return s;
+}
+
 static stmt*
 exp2bin_multiset(backend *be, sql_exp *fe, stmt *left, stmt *right, stmt *sel)
 {
@@ -1984,7 +2048,12 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        assert(vname->name);
                        s = stmt_var(be, vname->sname ? a_create(sql->sa, 
ma_strdup(sql->sa, vname->sname)) : NULL, ma_strdup(sql->sa, vname->name), 
e->tpe.type?&e->tpe:NULL, 0, e->flag);
                } else if (e->f) {              /* values */
-                       s = value_tvtree(be, e, left, sel);
+                       sql_subtype *t = exp_subtype(e);
+                       if (t->multiset == MS_VECTOR) {
+                               s = exp2stmt_vector(be, e, left, sel);
+                       } else {
+                               s = value_tvtree(be, e, left, sel);
+                       }
                } else {                        /* arguments */
                        sql_subtype *t = e->tpe.type?&e->tpe:NULL;
                        if (!t && 0) {
diff --git a/sql/backends/monet5/rel_tvtree.c b/sql/backends/monet5/rel_tvtree.c
--- a/sql/backends/monet5/rel_tvtree.c
+++ b/sql/backends/monet5/rel_tvtree.c
@@ -23,8 +23,6 @@ tv_get_type(sql_subtype *st)
        if (st->multiset) {
                if (st->multiset == MS_ARRAY)
                        return TV_MSET;
-               if (st->multiset == MS_VECTOR)
-                       return TV_VECTOR;
                if (st->multiset == MS_SETOF)
                        return TV_SETOF;
        } else if (st->type->composite)
@@ -57,14 +55,6 @@ tv_node(allocator *sa, sql_subtype *st, 
                                append(n->ctl, tv_node(sa, &sfa->type, 
tv_get_type(&sfa->type)));
                        }
                return n;
-        case TV_VECTOR:
-                       n->ctl = sa_list(sa);
-                       for (unsigned int i=0; i < st->digits; i++) {
-                               sql_subtype *_st = sql_create_subtype(sa, 
st->type, 0, 0);
-                               sn = tv_node(sa, _st, TV_BASIC);
-                               append(n->ctl, sn);
-                       }
-                       return n;
         case TV_MSET:
                        n->msnr = sa_list(sa);
                        /* fall through */
@@ -274,7 +264,6 @@ tv_parse_values_(backend *be, tv_tree *t
                 return mset_value_from_array_constructor(be, t, uc, left, sel);
             break;
                case TV_COMP:
-               case TV_VECTOR:
                        if (is_convert(value->type))
                                /* VALUES ('(1,"alice")') */
                                return comp_value_from_literal(be, t, value, 
left, sel);
@@ -388,7 +377,6 @@ tv_generate_stmts(backend *be, tv_tree *
                        s->subtype = *t->st;
                        return s;
                case TV_COMP:
-               case TV_VECTOR:
                        sl = sa_list(be->mvc->sa);
                        /* gather all the composite (sub)field's statements */
                        for (node *n = t->ctl->h; n; n = n->next)
diff --git a/sql/backends/monet5/rel_tvtree.h b/sql/backends/monet5/rel_tvtree.h
--- a/sql/backends/monet5/rel_tvtree.h
+++ b/sql/backends/monet5/rel_tvtree.h
@@ -37,7 +37,6 @@ typedef enum tv_type {
        TV_COMP,  // composite type
        TV_MSET,  // multiset of composite type
        TV_SETOF,  // setof of composite type
-       TV_VECTOR
 } tv_type;
 
 typedef struct type_values_tree {
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -3968,6 +3968,7 @@ exp_check_vector_type(mvc *sql, sql_subt
                        sql_exp *e = m->data;
                        sql_subtype st = *t;
                        st.multiset = 0;
+                       st.digits = 0;
                        e = exp_check_type(sql, &st, rel, e, tpe);
                        if (!e)
                                return NULL;
@@ -4047,6 +4048,22 @@ exp_check_multiset(mvc *sql, sql_exp *e)
        return NULL;
 }
 
+sql_exp *
+exp_check_vector(mvc *sql, sql_exp *e)
+{
+       if (is_values(e)) { /* check for single tuple type */
+               sql_subtype t = *sql_fetch_localtype(TYPE_dbl);
+               t.multiset = MS_VECTOR;
+               t.digits = list_length(e->f);
+               return exp_check_vector_type(sql, &t, NULL, e, type_equal);
+       }
+       sql_subtype *st = exp_subtype(e);
+       assert(st->multiset == MS_VECTOR);
+       if (st->multiset == MS_VECTOR)
+               return e;
+       return NULL;
+}
+
 static sql_exp *
 exp_check_type_intern(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp *exp, 
check_type tpe, bool atom_inplace)
 {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -244,6 +244,7 @@ extern int rel_set_type_param(mvc *sql, 
 extern sql_exp *exp_numeric_supertype(mvc *sql, sql_exp *e);
 extern sql_exp *exp_values_set_supertype(mvc *sql, sql_exp *values, 
sql_subtype *opt_super);
 extern sql_exp *exp_check_multiset(mvc *sql, sql_exp *exp); /* cast to any 
multiset */
+extern sql_exp *exp_check_vector(mvc *sql, sql_exp *exp);
 extern void free_exp(allocator *sa, sql_exp *e);
 extern void free_exps(allocator *sa, list *exps);
 
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
@@ -1368,7 +1368,7 @@ values_list(sql_query *query, symbol *ta
                values = tableref->data.lval->h->data.sym;
        if (values->token == SQL_ROW)
                return row(query, values);
-       if (values->token == SQL_SET)
+       if (values->token == SQL_SET || values->token == SQL_VECTOR)
                return set_values_list(query, values);
        //return simple_values_list(query, values);
        mvc *sql = query->sql;
@@ -1445,6 +1445,12 @@ rel_values(sql_query *query, symbol *tab
                if ((e = exp_check_multiset(query->sql, e)) == NULL)
                        return NULL;
                exps = append(nexps, e);
+       } else if (tableref->token == SQL_VECTOR) {
+               list *nexps = sa_list(query->sql->sa);
+               sql_exp *e = exp_values(query->sql->sa, exps);
+               if ((e = exp_check_vector(query->sql, e)) == NULL)
+                       return NULL;
+               exps = append(nexps, e);
        }
        sql_rel *r = rel_project(query->sql->sa, NULL, exps);
        r->nrcols = list_length(exps);
@@ -5645,6 +5651,7 @@ rel_value_exp2(sql_query *query, sql_rel
        case SQL_VALUES:
        case SQL_ROW:
        case SQL_SET:
+       case SQL_VECTOR:
        case SQL_WITH:
        case SQL_SELECT: {
                sql_rel *r = NULL;
@@ -5655,7 +5662,10 @@ rel_value_exp2(sql_query *query, sql_rel
                        query_push_outer(query, *rel, f);
                if (se->token == SQL_WITH) {
                        r = rel_with_query(query, se);
-               } else if (se->token == SQL_VALUES || se->token == SQL_ROW || 
se->token == SQL_SET) {
+               } else if (se->token == SQL_VALUES
+                               || se->token == SQL_ROW
+                               || se->token == SQL_SET
+                               || se->token == SQL_VECTOR) {
                        if (ek.card <= card_row && !(rel && *rel)) {
                                sql_exp *e = sql_exp_values(query, se);
                                if (!e)
diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c
--- a/sql/server/rel_semantic.c
+++ b/sql/server/rel_semantic.c
@@ -167,6 +167,7 @@ rel_semantic(sql_query *query, symbol *s
        case SQL_DECLARE:
        case SQL_CALL:
        case SQL_SET:
+       case SQL_VECTOR:
 
        case SQL_CREATE_TABLE_LOADER:
 
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -489,6 +489,7 @@ int yydebug=1;
        routine_designator
        expr_list
        array_expr
+       vector_expr
        array_expr_list
        schema_element_list
        schema_name_clause
@@ -5271,6 +5272,11 @@ opt_over:
        |   /* empty */                       { $$ = NULL; }
        ;
 
+vector_expr:
+               '[' expr_list ']'      { $$ = $2; }
+       |       '[' ']'                { $$ = NULL; }
+       ;
+
 array_expr:
                '[' expr_list ']'      { $$ = $2; }
        |       '['array_expr_list ']' { $$ = $2; }
@@ -5300,6 +5306,7 @@ value_exp:
        |       '('expr_list ',' scalar_exp ')'   { $$ = 
_symbol_create_list(SQL_ROW, append_symbol($2, $4)); }
        |       ARRAY select_with_parens          { $$ = $2; }
        |       ARRAY array_expr                  { $$ = 
_symbol_create_list(SQL_SET, $2); }
+       |       VECTOR vector_expr                { $$ = 
_symbol_create_list(SQL_VECTOR, $2); }
        |       session_user     { $$ = _symbol_create_list(SQL_NAME, 
append_string(append_string(L(), ma_strdup(SA, "sys")), ma_strdup(SA, 
"current_user"))); }
        |       CURRENT_SCHEMA   { $$ = _symbol_create_list(SQL_NAME, 
append_string(append_string(L(), ma_strdup(SA, "sys")), ma_strdup(SA, 
"current_schema"))); }
        |       CURRENT_ROLE     { $$ = _symbol_create_list(SQL_NAME, 
append_string(append_string(L(), ma_strdup(SA, "sys")), ma_strdup(SA, 
"current_role"))); }
@@ -8230,6 +8237,7 @@ char *token2string(tokens token)
        SQL(UPDATE);
        SQL(USING);
        SQL(VALUES);
+       SQL(VECTOR);
        SQL(VIEW);
        SQL(WHEN);
        SQL(WHILE);
diff --git a/sql/server/sql_tokens.h b/sql/server/sql_tokens.h
--- a/sql/server/sql_tokens.h
+++ b/sql/server/sql_tokens.h
@@ -157,6 +157,7 @@ typedef enum tokens {
        SQL_UPDATE,
        SQL_USING,
        SQL_VALUES,
+       SQL_VECTOR,
        SQL_VIEW,
        SQL_WHEN,
        SQL_WHILE,
diff --git a/sql/server/sqlparse.c b/sql/server/sqlparse.c
--- a/sql/server/sqlparse.c
+++ b/sql/server/sqlparse.c
@@ -429,6 +429,7 @@ sp_symbol2string(allocator *ta, mvc *sql
                        stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "cast("), val), 
" as "), tpe), ")");
                return res;
        }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to