Changeset: 9130e16b0959 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9130e16b0959
Added Files:
        sql/test/miscellaneous/Tests/column_aliases.sql
        sql/test/miscellaneous/Tests/column_aliases.stable.err
        sql/test/miscellaneous/Tests/column_aliases.stable.out
        sql/test/miscellaneous/Tests/values.sql
        sql/test/miscellaneous/Tests/values.stable.err
        sql/test/miscellaneous/Tests/values.stable.out
Modified Files:
        clients/mapiclient/mhelp.c
        sql/ChangeLog
        sql/backends/monet5/UDF/pyapi/convert_loops.h
        sql/backends/monet5/generator/generator.c
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/server/rel_semantic.c
        sql/server/sql_parser.y
        sql/test/BugTracker-2015/Tests/ambiguous.Bug-3803.stable.out
        sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
        
sql/test/BugTracker-2017/Tests/sqlitelogictest-cast-decimal.Bug-6445.stable.out
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
        
sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-aritmetic-expressions-handling.Bug-6576.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-aritmetic-expressions-handling.Bug-6576.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-aritmetic-expressions-handling.Bug-6576.stable.out.int128
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-add.Bug-6630.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-not-in.Bug-6605.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-cast-null-not-in.Bug-6605.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-mal-calc-undefined.Bug-6566.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-mal-calc-undefined.Bug-6566.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-select-nullif-case.Bug-6579.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-select-nullif-case.Bug-6579.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-select-nullif-case.Bug-6579.stable.out.int128
        sql/test/mapi/Tests/perl_dbi.stable.out
        sql/test/mapi/Tests/python2_dbapi.stable.out
        sql/test/mapi/Tests/python3_dbapi.stable.out
        sql/test/miscellaneous/Tests/All
Branch: mtime
Log Message:

Merge with default branch.


diffs (truncated from 1485 to 300 lines):

diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -516,6 +516,11 @@ SQLhelp sqlhelp1[] = {
         "[ WITH with_list ] UPDATE qname [ [AS] ident ] SET assignment_list [ 
WHERE search_condition ]",
         "with_list,assignment_list,search_condition",
         NULL},
+       {"VALUES",
+        "",
+        "VALUES row_values",
+        "row_values",
+        NULL},
        {"WHILE",
         "",
         "[ident ':'] WHILE search_condition DO procedure_statement ... END 
WHILE [ident]",
diff --git a/sql/ChangeLog b/sql/ChangeLog
--- a/sql/ChangeLog
+++ b/sql/ChangeLog
@@ -1,6 +1,9 @@
 # ChangeLog file for sql
 # This file is updated with Maddlog
 
+* Mon May  6 2019 Pedro Ferreira <[email protected]>
+- Added "VALUES row_list" statement as a top SQL projection statement.
+
 * Mon Feb 18 2019 Aris Koning <[email protected]>
 - The implementation of in-expression now follows a join-based approach
   instead of using iterative union/selects. This greatly improves
diff --git a/sql/backends/monet5/UDF/pyapi/convert_loops.h 
b/sql/backends/monet5/UDF/pyapi/convert_loops.h
--- a/sql/backends/monet5/UDF/pyapi/convert_loops.h
+++ b/sql/backends/monet5/UDF/pyapi/convert_loops.h
@@ -290,7 +290,8 @@ convert_and_append(BAT* b, const char* t
                size_t len = 0;
                gdk_return ret;
 
-               BATatoms[b->ttype].atomFromStr(text, &len, &element, false);
+               if (BATatoms[b->ttype].atomFromStr(text, &len, &element, false) 
< 0)
+                       return GDK_FAIL;
                ret = BUNappend(b, element, force);
                GDKfree(element);
                return ret;
diff --git a/sql/backends/monet5/generator/generator.c 
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -649,7 +649,7 @@ str VLTgenerator_thetasubselect(Client c
                        if ( strcmp(oper,">") == 0){
                                lng one = 1;
                                low= *getArgReference_TYPE(stk,pci,idx, 
timestamp);
-                               if ((msg = MTIMEtimestamp_add(&hgh, &hgh, 
&one)) != MAL_SUCCEED) {
+                               if ((msg = MTIMEtimestamp_add(&low, &low, 
&one)) != MAL_SUCCEED) {
                                        if (cand)
                                                BBPunfix(cand->batCacheid);
                                        return msg;
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
@@ -1454,9 +1454,10 @@ exp_is_null(mvc *sql, sql_exp *e )
                node *n;
                list *l = e->l;
 
-               if (!r && l)
-                       for (n = l->h; n && r; n = n->next) 
+               if (!r && l && list_length(l) == 2) {
+                       for (n = l->h; n && !r; n = n->next) 
                                r |= exp_is_null(sql, n->data);
+               }
                return r;
        }
        case e_column:
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -3087,7 +3087,8 @@ exp_simplify_math( mvc *sql, sql_exp *e,
                                atom *la = exp_flatten(sql, le);
                                atom *ra = exp_flatten(sql, re);
 
-                               if (la && ra) {
+                               /* TODO check if output type is larger then 
input */
+                               if (la && ra && subtype_cmp(atom_type(la), 
atom_type(ra)) == 0 && subtype_cmp(atom_type(la), exp_subtype(e)) == 0) {
                                        atom *a = atom_mul(la, ra);
 
                                        if (a && atom_cast(sql->sa, a, 
exp_subtype(e))) {
@@ -6132,7 +6133,7 @@ rel_push_project_up(int *changes, mvc *s
                for (n = rel->exps->h; n && !fnd; n = n->next) {
                        sql_exp *e = n->data;
 
-                       if (e->type != e_aggr && e->type != e_column) {
+                       if (e->type != e_aggr && e->type != e_column && e->type 
!= e_atom) {
                                fnd = 1;
                        }
                }
@@ -6466,7 +6467,7 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
        }
 }
 
-static sql_rel * rel_dce_sub(mvc *sql, sql_rel *rel, list *refs);
+static sql_rel * rel_dce_sub(mvc *sql, sql_rel *rel);
 
 static sql_rel *
 rel_remove_unused(mvc *sql, sql_rel *rel) 
@@ -6769,25 +6770,22 @@ rel_dce_refs(mvc *sql, sql_rel *rel, lis
 }
 
 static sql_rel *
-rel_dce_down(mvc *sql, sql_rel *rel, list *refs, int skip_proj) 
+rel_dce_down(mvc *sql, sql_rel *rel, int skip_proj) 
 {
        if (!rel)
                return rel;
 
-       if (!skip_proj && rel_is_ref(rel)) {
-               if (!list_find(refs, rel, NULL))
-                       list_append(refs, rel);
+       if (!skip_proj && rel_is_ref(rel))
                return rel;
-       }
 
        switch(rel->op) {
        case op_basetable:
        case op_table:
 
                if (skip_proj && rel->l && rel->op == op_table && rel->flag != 
2)
-                       rel->l = rel_dce_down(sql, rel->l, refs, 0);
+                       rel->l = rel_dce_down(sql, rel->l, 0);
                if (!skip_proj)
-                       rel_dce_sub(sql, rel, refs);
+                       rel_dce_sub(sql, rel);
                /* fall through */
 
        case op_truncate:
@@ -6797,16 +6795,16 @@ rel_dce_down(mvc *sql, sql_rel *rel, lis
 
        case op_insert:
                rel_used(rel->r);
-               rel_dce_sub(sql, rel->r, refs);
+               rel_dce_sub(sql, rel->r);
                return rel;
 
        case op_update:
        case op_delete:
 
                if (skip_proj && rel->r)
-                       rel->r = rel_dce_down(sql, rel->r, refs, 0);
+                       rel->r = rel_dce_down(sql, rel->r, 0);
                if (!skip_proj)
-                       rel_dce_sub(sql, rel, refs);
+                       rel_dce_sub(sql, rel);
                return rel;
 
        case op_topn: 
@@ -6815,9 +6813,9 @@ rel_dce_down(mvc *sql, sql_rel *rel, lis
        case op_groupby: 
 
                if (skip_proj && rel->l)
-                       rel->l = rel_dce_down(sql, rel->l, refs, 
is_topn(rel->op) || is_sample(rel->op));
+                       rel->l = rel_dce_down(sql, rel->l, is_topn(rel->op) || 
is_sample(rel->op));
                if (!skip_proj)
-                       rel_dce_sub(sql, rel, refs);
+                       rel_dce_sub(sql, rel);
                return rel;
 
        case op_union: 
@@ -6825,17 +6823,17 @@ rel_dce_down(mvc *sql, sql_rel *rel, lis
        case op_except: 
                if (skip_proj) {
                        if (rel->l)
-                               rel->l = rel_dce_down(sql, rel->l, refs, 0);
+                               rel->l = rel_dce_down(sql, rel->l, 0);
                        if (rel->r)
-                               rel->r = rel_dce_down(sql, rel->r, refs, 0);
+                               rel->r = rel_dce_down(sql, rel->r, 0);
                }
                if (!skip_proj)
-                       rel_dce_sub(sql, rel, refs);
+                       rel_dce_sub(sql, rel);
                return rel;
 
        case op_select: 
                if (rel->l)
-                       rel->l = rel_dce_down(sql, rel->l, refs, 0);
+                       rel->l = rel_dce_down(sql, rel->l, 0);
                return rel;
 
        case op_join: 
@@ -6845,9 +6843,9 @@ rel_dce_down(mvc *sql, sql_rel *rel, lis
        case op_semi: 
        case op_anti: 
                if (rel->l)
-                       rel->l = rel_dce_down(sql, rel->l, refs, 0);
+                       rel->l = rel_dce_down(sql, rel->l, 0);
                if (rel->r)
-                       rel->r = rel_dce_down(sql, rel->r, refs, 0);
+                       rel->r = rel_dce_down(sql, rel->r, 0);
                return rel;
        }
        return rel;
@@ -6860,7 +6858,7 @@ rel_dce_down(mvc *sql, sql_rel *rel, lis
  */
 
 static sql_rel *
-rel_dce_sub(mvc *sql, sql_rel *rel, list *refs)
+rel_dce_sub(mvc *sql, sql_rel *rel)
 {
        if (!rel)
                return rel;
@@ -6872,7 +6870,7 @@ rel_dce_sub(mvc *sql, sql_rel *rel, list
         */
        rel_mark_used(sql, rel, 1);
        rel = rel_remove_unused(sql, rel);
-       rel_dce_down(sql, rel, refs, 1);
+       rel_dce_down(sql, rel, 1);
        return rel;
 }
 
@@ -6948,7 +6946,6 @@ sql_rel *
 rel_dce(mvc *sql, sql_rel *rel)
 {
        list *refs = sa_list(sql->sa);
-       //node *n;
 
        rel_dce_refs(sql, rel, refs);
        if (refs) {
@@ -6965,7 +6962,7 @@ rel_dce(mvc *sql, sql_rel *rel)
        }
        rel = rel_add_projects(sql, rel);
        rel_used(rel);
-       rel_dce_sub(sql, rel, refs);
+       rel_dce_sub(sql, rel);
        return rel;
 }
 
@@ -9153,7 +9150,7 @@ optimize(mvc *sql, sql_rel *rel, int val
                for (n = refs->h; n; n = n->next)
                        n->data = optimize_rel(sql, n->data, &changes, 0, 
value_based_opt);
        }
-
+       rel = rel_dce(sql, rel);
        return rel;
 }
 
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -545,6 +545,7 @@ rel_project_add_exp( mvc *sql, sql_rel *
                if (!rel->exps)
                        rel->exps = new_exp_list(sql->sa);
                append(rel->exps, e);
+               rel->nrcols++;
                if (e->card > rel->card)
                        rel->card = e->card;
        } else if (rel->op == op_groupby) {
@@ -647,6 +648,7 @@ rel_groupby_add_aggr(mvc *sql, sql_rel *
                        exp_setname(sql->sa, e, nme, nme);
                }
                append(rel->exps, e);
+               rel->nrcols++;
                m = e;
        }
        ne = exp_column(sql->sa, exp_relname(m), exp_name(m), exp_subtype(m),
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
@@ -217,6 +217,8 @@ rel_table_optname(mvc *sql, sql_rel *sq,
                        sq = rel_project(sql->sa, sq, rel_projections(sql, sq, 
NULL, 1, 1));
                        osq = sq;
                }
+               if (columnrefs && dlist_length(columnrefs) > sq->nrcols)
+                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: The 
number of aliases is longer than the number of columns (%d>%d)", 
dlist_length(columnrefs), sq->nrcols);
                if (columnrefs && sq->exps) {
                        dnode *d = columnrefs->h;
                        node *ne = sq->exps->h;
@@ -608,7 +610,7 @@ rel_named_table_function(sql_query *quer
                        append(tl, exp_subtype(e));
                }
        }
-               
+
        if (sname)
                s = mvc_bind_schema(sql, sname);
        e = find_table_function(sql, s, fname, exps, tl);
@@ -650,6 +652,8 @@ rel_named_table_function(sql_query *quer
                append(exps, exp_column(sql->sa, tname, a->name, &a->type, 
CARD_MULTI, 1, 0));
        }
        rel = rel_table_func(sql->sa, rel, e, exps, (sq != NULL));
+       if (ast->data.lval->h->next->data.sym && 
ast->data.lval->h->next->data.sym->data.lval->h->next->data.lval)
+               rel = rel_table_optname(sql, rel, 
ast->data.lval->h->next->data.sym);
        return rel;
 }
 
@@ -712,18 +716,18 @@ rel_values(sql_query *query, symbol *tab
        symbol *optname = rowlist->t->data.sym;
        dnode *o;
        node *m;
-       list *exps = sa_list(sql->sa); 
-
+       list *exps = sa_list(sql->sa);
        exp_kind ek = {type_value, card_value, TRUE};
-       if (!rowlist->h)
-               r = rel_project(sql->sa, NULL, NULL);
-
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to