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]