Changeset: 6a0114e4da74 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6a0114e4da74
Added Files:
        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/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
        sql/server/rel_exp.c
        sql/server/rel_optimizer.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-2016/Tests/convert-function-test-hge.Bug-3460.stable.out.int128
        sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out
        
sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out.int128
        
sql/test/BugTracker-2017/Tests/sqlitelogictest-cast-decimal.Bug-6445.stable.out
        
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: default
Log Message:

merged


diffs (truncated from 1207 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
@@ -647,7 +647,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/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
@@ -582,7 +582,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                list *l = sa_list(sql->sa), *exps = e->l;
                sql_subfunc *f = e->f;
                stmt *rows = NULL, *cond_execution = NULL;
-               char name[16], *nme;
+               char name[16], *nme = NULL;
 
                if (f->func->side_effect && left) {
                        if (!exps || list_empty(exps))
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -2750,7 +2750,13 @@ stmt_convert(backend *be, stmt *v, sql_s
        if (v->nr < 0)
                return NULL;
 
-       if (t->type->localtype == f->type->localtype && (t->type->eclass == 
f->type->eclass || (EC_VARCHAR(f->type->eclass) && 
EC_VARCHAR(t->type->eclass))) && !EC_INTERVAL(f->type->eclass) && 
f->type->eclass != EC_DEC && (t->digits == 0 || f->digits == t->digits)) {
+       if (t->type->localtype == f->type->localtype &&
+           (t->type->eclass == f->type->eclass ||
+            (EC_VARCHAR(f->type->eclass) && EC_VARCHAR(t->type->eclass))) &&
+           !EC_INTERVAL(f->type->eclass) &&
+           f->type->eclass != EC_DEC &&
+           (t->digits == 0 || f->digits == t->digits) &&
+           type_has_tz(t) == type_has_tz(f)) {
                return v;
        }
 
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)
+               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;
                        }
                }
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
@@ -717,17 +717,17 @@ rel_values(sql_query *query, symbol *tab
        dnode *o;
        node *m;
        list *exps = sa_list(sql->sa);
-
        exp_kind ek = {type_value, card_value, TRUE};
-       if (!rowlist->h)
-               r = rel_project(sql->sa, NULL, NULL);
-
-       /* last element in the list is the table_name */
-       for (o = rowlist->h; o->next; o = o->next) {
+
+       for (o = rowlist->h; o; o = o->next) {
                dlist *values = o->data.lval;
 
-               if (r && list_length(r->exps) != dlist_length(values)) {
-                       return sql_error(sql, 02, SQLSTATE(42000) "VALUES: 
number of values doesn't match");
+               /* When performing sub-queries, the relation name appears under 
a SQL_NAME symbol at the end of the list */
+               if (o->type == type_symbol && o->data.sym->token == SQL_NAME)
+                       break;
+
+               if (!list_empty(exps) && list_length(exps) != 
dlist_length(values)) {
+                       return sql_error(sql, 02, SQLSTATE(42000) "VALUES: 
number of columns doesn't match between rows");
                } else {
                        dnode *n;
 
@@ -2606,6 +2606,8 @@ rel_logical_value_exp(sql_query *query, 
                        return rel_lastexp(sql, *rel);
                return NULL;
        }
+       case SQL_DEFAULT:
+               return sql_error(sql, 02, SQLSTATE(42000) "DEFAULT keyword not 
allowed outside insert and update statements");
        default: {
                sql_exp *re, *le = rel_value_exp(query, rel, sc, f, ek);
                sql_subtype bt;
@@ -2689,6 +2691,7 @@ rel_in_exp(sql_query *query, sql_rel *re
 
                        r = rel_value_exp(query, &z, n->data.sym, f /* ie no 
result project */, ek);
                        if (!r) {
+                               sql_rel *oleft = left;
                                /* reset error */
                                sql->session->status = 0;
                                sql->errstr[0] = 0;
@@ -2696,6 +2699,8 @@ rel_in_exp(sql_query *query, sql_rel *re
                                r = rel_value_exp(query, &left, n->data.sym, f 
/* ie no result project */, ek);
                                if (r)
                                        l_used = is_join(left->op);
+                               if (oleft != left)
+                                       l_outer = 1;
                        }
                        if (!r) {
                                /* reset error */
@@ -2756,12 +2761,13 @@ rel_in_exp(sql_query *query, sql_rel *re
                                        }
                                        if (rel_convert_types(sql, &l, &r, 1, 
type_equal_no_any) < 0) 
                                                return NULL;
-                                       r = exp_compare(sql->sa, l, r, 
sc->token==SQL_IN?mark_in:mark_notin); 
+                                       r = exp_compare(sql->sa, l, r, 
(z||l_outer)?(sc->token==SQL_IN?mark_in:mark_notin):
+                                                                        
(sc->token==SQL_IN?cmp_equal:cmp_notequal)); 
                                        if (z) {
                                                left = 
rel_crossproduct(sql->sa, left, z, sc->token==SQL_IN?op_semi:op_anti);
                                                if (rel_has_freevar(z))
                                                        set_dependent(left);
-                                       } else {
+                                       } else if (l_outer) {
                                                left->op = 
sc->token==SQL_IN?op_semi:op_anti;
                                        }
                                        rel_join_add_exp(sql->sa, left, r);
@@ -3272,6 +3278,8 @@ rel_logical_exp(sql_query *query, sql_re
        case SQL_EXCEPT:
        case SQL_INTERSECT:
                return rel_setquery(query, rel, sc);
+       case SQL_DEFAULT:
+               return sql_error(sql, 02, SQLSTATE(42000) "DEFAULT keyword not 
allowed outside insert and update statements");
        default: {
                sql_exp *re, *le = rel_value_exp(query, &rel, sc, f, ek);
 
@@ -3329,8 +3337,7 @@ rel_unop_(sql_query *query, sql_exp *e, 
                        f = NULL;
        }
        if (f && check_card(card, f)) {
-               sql_arg *ares = f->func->res?f->func->res->h->data:NULL;
-               if (ares && ares->type.scale == INOUT) {
+               if (f->func->fix_scale == INOUT) {
                        sql_subtype *res = f->res->h->data;
                        res->digits = t->digits;
                        res->scale = t->scale;
@@ -5814,6 +5821,8 @@ rel_value_exp2(sql_query *query, sql_rel
        case SQL_COALESCE:
        case SQL_NULLIF:
                return rel_case_exp(query, rel, se, f);
+       case SQL_DEFAULT:
+               return sql_error(sql, 02, SQLSTATE(42000) "DEFAULT keyword not 
allowed outside insert and update statements");
        case SQL_XMLELEMENT:
        case SQL_XMLFOREST:
        case SQL_XMLCOMMENT:
@@ -6422,8 +6431,6 @@ rel_setquery(sql_query *query, sql_rel *
        return res;
 }
 
-
-
 static sql_rel *
 rel_joinquery_(sql_query *query, sql_rel *rel, symbol *tab1, int natural, jt 
jointype, symbol *tab2, symbol *js)
 {
@@ -6682,6 +6689,10 @@ rel_selects(sql_query *query, symbol *s)
                ret = rel_with_query(query, s);
                sql->type = Q_TABLE;
                break;
+       case SQL_VALUES:
+               ret = rel_values(query, s);
+               sql->type = Q_TABLE;
+               break;
        case SQL_SELECT: {
                exp_kind ek = {type_value, card_relation, TRUE};
                SelectNode *sn = (SelectNode *) s;
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
@@ -234,6 +234,7 @@ rel_semantic(sql_query *query, symbol *s
        case SQL_UNION:
        case SQL_EXCEPT:
        case SQL_INTERSECT:
+       case SQL_VALUES:
                return rel_selects(query, s);
 
        default:
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
@@ -3223,8 +3223,6 @@ values_or_query_spec:
                { $$ = _symbol_create_list( SQL_VALUES, L()); }
  |   DEFAULT VALUES
                { $$ = _symbol_create_list( SQL_VALUES, L()); }
- |   VALUES row_commalist
-               { $$ = _symbol_create_list( SQL_VALUES, $2); }
  |  query_expression
  ;
 
@@ -3437,11 +3435,9 @@ with_query_expression:
  | merge_stmt
  ;
 
-
 sql:
-    select_statement_single_row
-|
-    select_no_parens_orderby
+   select_statement_single_row
+ | select_no_parens_orderby
  ;
 
 simple_select:
@@ -3536,6 +3532,7 @@ select_no_parens:
          append_list(l, $4);
          append_symbol(l, $5);
          $$ = _symbol_create_list( SQL_INTERSECT, l); }
+ |  VALUES row_commalist     { $$ = _symbol_create_list( SQL_VALUES, $2); }
  |  '(' select_no_parens ')' { $$ = $2; }
  |   simple_select
  ;
@@ -4018,21 +4015,14 @@ filter_exp:
                  $$ = _symbol_create_list(SQL_FILTER, l ); }
  ;
 
-
 subquery_with_orderby:
     '(' select_no_parens_orderby ')'   { $$ = $2; }
- |  '(' VALUES row_commalist ')'       
-                               { $$ = _symbol_create_list( SQL_VALUES, $3); }
- |  '(' with_query ')' 
-                               { $$ = $2; }
+ |  '(' with_query ')'                 { $$ = $2; }
  ;
 
 subquery:
     '(' select_no_parens ')'   { $$ = $2; }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to