Changeset: 807b2332eec2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=807b2332eec2
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_statement.c
Branch: unlock
Log Message:

Merge with default branch.


diffs (257 lines):

diff --git a/monetdb5/modules/mal/sysmon.c b/monetdb5/modules/mal/sysmon.c
--- a/monetdb5/modules/mal/sysmon.c
+++ b/monetdb5/modules/mal/sysmon.c
@@ -31,13 +31,14 @@ SYSMONqueue(Client cntxt, MalBlkPtr mb, 
        bat *w = getArgReference_bat(stk,pci,7);
        bat *m = getArgReference_bat(stk,pci,8);
        lng qtag;
-       int wrk, mem, sz;
+       int wrk, mem;
+       BUN sz;
        timestamp tsn;
        str msg = MAL_SUCCEED;
 
        (void) cntxt;
        (void) mb;
-       sz = qsize;     // reserve space for all tuples in QRYqueue
+       sz = (BUN) qsize;       // reserve space for all tuples in QRYqueue
        tag = COLnew(0, TYPE_lng, sz, TRANSIENT);
        sessionid = COLnew(0, TYPE_int, sz, TRANSIENT);
        user = COLnew(0, TYPE_str, sz, TRANSIENT);
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
@@ -774,7 +774,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                }
                assert(!e->r);
                if (exps) {
-                       int nrcols = 0;
+                       unsigned nrcols = 0;
                        int push_cond_exec = 0, coalesce = 0;
                        stmt *ncond = NULL, *ocond = cond;
 
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
@@ -2612,7 +2612,7 @@ stmt_catalog(backend *be, int type, stmt
 void
 stmt_set_nrcols(stmt *s)
 {
-       int nrcols = 0;
+       unsigned nrcols = 0;
        int key = 1;
        node *n;
        list *l = s->op4.lval;
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
@@ -3167,34 +3167,33 @@ static sql_exp *
 rel_nop(sql_query *query, sql_rel **rel, symbol *se, int fs, exp_kind ek)
 {
        mvc *sql = query->sql;
-       int nr_args = 0;
+       int nr_args = 0, err = 0;
        dnode *l = se->data.lval->h;
        dnode *ops = l->next->next->data.lval?l->next->next->data.lval->h:NULL;
        list *exps = sa_list(sql->sa), *tl = sa_list(sql->sa);
        sql_subfunc *sf = NULL;
        sql_schema *s = cur_schema(sql);
        exp_kind iek = {type_value, card_column, FALSE};
-       int err = 0;
 
        for (; ops; ops = ops->next, nr_args++) {
-               sql_exp *e = rel_value_exp(query, rel, ops->data.sym, fs, iek);
-               sql_subtype *tpe;
-
-               if (!e)
-                       err = 1;
-               append(exps, e);
-               if (e) {
-                       tpe = exp_subtype(e);
-                       append(tl, tpe);
+               if (!err) { /* we need the nr_args count at the end, but if an 
error is found, stop calling rel_value_exp */
+                       sql_exp *e = rel_value_exp(query, rel, ops->data.sym, 
fs, iek);
+                       if (!e) {
+                               err = 1;
+                               continue;
+                       }
+                       append(exps, e);
+                       append(tl, exp_subtype(e));
                }
        }
        if (l->type == type_int) {
                /* exec nr (ops)*/
                int nr = l->data.i_val;
-               cq *q = qc_find(sql->qc, nr);
-
-               if (q) {
-                       node *n, *m;
+               cq *q;
+
+               if (err)
+                       return NULL;
+               if ((q = qc_find(sql->qc, nr))) {
                        list *nexps = new_exp_list(sql->sa);
                        sql_func *f = q->f;
 
@@ -3202,7 +3201,7 @@ rel_nop(sql_query *query, sql_rel **rel,
                        if (list_length(f->ops) != list_length(exps))
                                return sql_error(sql, 02, SQLSTATE(42000) "EXEC 
called with wrong number of arguments: expected %d, got %d", 
list_length(f->ops), list_length(exps));
                        if (exps->h && f->ops) {
-                               for (n = exps->h, m = f->ops->h; n && m; n = 
n->next, m = m->next) {
+                               for (node *n = exps->h, *m = f->ops->h; n && m; 
n = n->next, m = m->next) {
                                        sql_arg *a = m->data;
                                        sql_exp *e = n->data;
                                        sql_subtype *ntp = &a->type;
@@ -3219,6 +3218,7 @@ rel_nop(sql_query *query, sql_rel **rel,
                        sql->type = q->type;
                        if (nexps)
                                return exp_op(sql->sa, nexps, 
sql_dup_subfunc(sql->sa, f, tl, NULL));
+                       return NULL;
                } else {
                        return sql_error(sql, 02, SQLSTATE(42000) "EXEC: 
PREPARED Statement missing '%d'", nr);
                }
@@ -3231,7 +3231,6 @@ rel_nop(sql_query *query, sql_rel **rel,
 
        /* first try aggregate */
        sf = find_func(sql, s, fname, nr_args, F_AGGR, NULL);
-
        if (sf) { /* We have to pas the arguments properly, so skip call to 
rel_aggr */
                if (err) {
                        /* reset error */
diff --git a/sql/test/SQLancer/Tests/sqlancer03.sql 
b/sql/test/SQLancer/Tests/sqlancer03.sql
--- a/sql/test/SQLancer/Tests/sqlancer03.sql
+++ b/sql/test/SQLancer/Tests/sqlancer03.sql
@@ -457,3 +457,12 @@ insert into t0(c0) values(13), (((cast((0.1) between 
symmetric (0.2) and (0.3) as 
int))%(length(upper(r'u鋔wsD30pYi&ᴮ*2*W쉉t+詫sD^#cjX{'))))), (cast(cast(cast(0.12 
as int) as string(646)) as int));
 SELECT COUNT(t0.c0 = t0.c0 OR 1 BETWEEN ASYMMETRIC 1 AND 1) FROM t0;
 SELECT 0.9, COUNT(ALL (((((((CAST(TRUE AS INT))-(t0.c0)))=(t0.c0))) = 
TRUE)OR((CAST(char_length(r'H') AS INT)) BETWEEN ASYMMETRIC (CAST(-1.3 AS INT)) 
AND (+ (length(r'0')))))), 0.3 FROM t0 GROUP BY 0.5, 0.4;
 ROLLBACK;
+
+START TRANSACTION;
+CREATE TABLE t0(c0 DATE, c1 DATE);
+SELECT ALL least(MIN(ALL CAST('0.3' AS TIME)), COALESCE 
(CAST("second"(TIMESTAMP '1970-01-19 08:50:25') AS TIME), CAST(TIME '13:00:42' 
AS TIME))), t0.c0 FROM t0
+GROUP BY splitpart(CAST(CAST(COALESCE (CASE t0.c1 WHEN INTERVAL '5' SECOND 
THEN TIMESTAMP '1969-12-21 20:30:09' WHEN 0.5 THEN TIMESTAMP '1970-01-11 
15:00:27' WHEN 0.9 
+THEN TIMESTAMP '1970-01-03 20:35:51' END, CASE -2 WHEN 0.2 THEN TIMESTAMP 
'1970-01-02 09:18:35' END, CAST(INTERVAL '3' SECOND AS TIMESTAMP), 
+TIMESTAMP '1970-01-19 23:59:32') AS STRING(660)) AS STRING), COALESCE 
(CAST(COALESCE (CAST(INTERVAL '2' SECOND AS INTERVAL SECOND), INTERVAL '-4' 
SECOND, INTERVAL '-4' SECOND) AS STRING), 'a'),
+CAST(CAST(((- (-5))||(((-2)-(5)))) AS DECIMAL) AS INT));
+ROLLBACK;
diff --git a/sql/test/SQLancer/Tests/sqlancer03.stable.err 
b/sql/test/SQLancer/Tests/sqlancer03.stable.err
--- a/sql/test/SQLancer/Tests/sqlancer03.stable.err
+++ b/sql/test/SQLancer/Tests/sqlancer03.stable.err
@@ -13,6 +13,13 @@ MAPI  = (monetdb) /var/tmp/mtest-71583/.
 QUERY = select cast(group_concat(all r'0.5787210717348131') as decimal) from 
t0 group by - (abs(- (- (1061572565)))), least(t0.c0, least(cast(0.09300166 as 
int), t0.c0));
 ERROR = !Rounding of decimal 
(0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131,0.5787210717348131)
 doesn't fit format (18.3)
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-608035/.s.monetdb.30116
+QUERY = SELECT ALL least(MIN(ALL CAST('0.3' AS TIME)), COALESCE 
(CAST("second"(TIMESTAMP '1970-01-19 08:50:25') AS TIME), CAST(TIME '13:00:42' 
AS TIME))), t0.c0 FROM t0
+        GROUP BY splitpart(CAST(CAST(COALESCE (CASE t0.c1 WHEN INTERVAL '5' 
SECOND THEN TIMESTAMP '1969-12-21 20:30:09' WHEN 0.5 THEN TIMESTAMP '1970-01-11 
15:00:27' WHEN 0.9 
+        THEN TIMESTAMP '1970-01-03 20:35:51' END, CASE -2 WHEN 0.2 THEN 
TIMESTAMP '1970-01-02 09:18:35' END, CAST(INTERVAL '3' SECOND AS TIMESTAMP), 
+        TIMESTAMP '1970-01-19 23:59:32') AS STRING(660)) AS STRING), COALESCE 
(CAST(COALESCE (CAST(INTERVAL '2' SECOND AS INTERVAL SECOND), INTERVAL '-4' 
SECOND, INTERVAL '-4' SECOND) AS STRING), 'a'),
+ERROR = !types decimal(2,1) and date(2,1) are not equal
+CODE  = 42000
 
 # 17:14:16 >  
 # 17:14:16 >  "Done."
diff --git a/sql/test/SQLancer/Tests/sqlancer03.stable.out 
b/sql/test/SQLancer/Tests/sqlancer03.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer03.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer03.stable.out
@@ -55,8 +55,8 @@ stdout of test 'sqlancer03` in directory
 [ NULL ]
 #SELECT ALL length(upper(MIN(ALL CAST(((trim(CAST(r'' AS STRING(659)), 
CAST(r'o3%+i]抔DCöf▟nßOpNbybಜ7' AS STRING)))||(sql_min(sql_max(NULL, r''), 
splitpart(r'x', r',7+.', t0.c1)))) AS STRING(151))))), 0.4179268710155164 
 #FROM v0 LEFT OUTER JOIN t0 ON NOT (t0.c0) WHERE t0.c0 GROUP BY 0.3584962, 
CAST(t0.c1 AS STRING(601)), t0.c1;
-% .%26,        .%27 # table_name
-% %26, %27 # name
+% .%25,        .%26 # table_name
+% %25, %26 # name
 % int, decimal # type
 % 1,   19 # length
 #ROLLBACK;
@@ -448,8 +448,8 @@ stdout of test 'sqlancer03` in directory
 % 1 # length
 [ NULL ]
 #SELECT ALL CAST(SUM(ALL COALESCE (CAST(0.67090863 AS REAL), 
dayofmonth(t0.c0))) AS BIGINT) FROM t0;
-% .%3 # table_name
-% %3 # name
+% .%2 # table_name
+% %2 # name
 % bigint # type
 % 1 # length
 [ NULL ]
@@ -636,6 +636,19 @@ stdout of test 'sqlancer03` in directory
 #0.715
 #0.369
 [ 8    ]
+#SELECT ALL CASE t0.c0 WHEN VAR_POP(ALL t0.c0) THEN (t0.c0) BETWEEN SYMMETRIC 
(t0.c0) AND (t0.c0) END FROM t0 GROUP BY t0.c0;
+% sys.%2 # table_name
+% %2 # name
+% boolean # type
+% 5 # length
+[ NULL ]
+[ NULL ]
+[ NULL ]
+[ NULL ]
+[ NULL ]
+[ NULL ]
+[ NULL ]
+[ NULL ]
 #ROLLBACK;
 #START TRANSACTION;
 #CREATE TABLE "sys"."t0" ("c0" INT);
diff --git a/sql/test/miscellaneous/Tests/select_groupby.sql 
b/sql/test/miscellaneous/Tests/select_groupby.sql
--- a/sql/test/miscellaneous/Tests/select_groupby.sql
+++ b/sql/test/miscellaneous/Tests/select_groupby.sql
@@ -183,4 +183,10 @@ LIMIT 1001 OFFSET 0;
 
 exec ** ();
 
+prepare select cast(? as interval second);
+exec ** (blob 'aaaa'); --error, cannot cast
+
+prepare select cast(? as interval second);
+exec ** (time '10:00:00' + 1); --error, no such binary operator
+
 drop schema "myschema" cascade;
diff --git a/sql/test/miscellaneous/Tests/select_groupby.stable.err 
b/sql/test/miscellaneous/Tests/select_groupby.stable.err
--- a/sql/test/miscellaneous/Tests/select_groupby.stable.err
+++ b/sql/test/miscellaneous/Tests/select_groupby.stable.err
@@ -46,6 +46,14 @@ MAPI  = (monetdb) /var/tmp/mtest-399914/
 QUERY = exec  4 (); --error, from the condition "'col9'"='', it fails to 
covert '' to date
 ERROR = !Date '' has incorrect format
 CODE  = 22007
+MAPI  = (monetdb) /var/tmp/mtest-609547/.s.monetdb.33705
+QUERY = exec  6 (blob 'aaaa'); --error, cannot cast
+ERROR = !types blob(0,0) and sec_interval(13,0) are not equal
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-676930/.s.monetdb.35752
+QUERY = exec  7 (time '10:00:00' + 1); --error, no such binary operator
+ERROR = !SELECT: no such binary operator 'sql_add(time,tinyint)'
+CODE  = 42000
 
 # 13:54:02 >  
 # 13:54:02 >  "Done."
diff --git a/sql/test/miscellaneous/Tests/select_groupby.stable.out 
b/sql/test/miscellaneous/Tests/select_groupby.stable.out
--- a/sql/test/miscellaneous/Tests/select_groupby.stable.out
+++ b/sql/test/miscellaneous/Tests/select_groupby.stable.out
@@ -319,6 +319,22 @@ stdout of test 'select_groupby` in direc
 % 'col26' # name
 % varchar # type
 % 0 # length
+#prepare select cast(? as interval second);
+#prepare select cast(? as interval second);
+% .prepare,    .prepare,       .prepare,       .prepare,       .prepare,       
.prepare # table_name
+% type,        digits, scale,  schema, table,  column # name
+% varchar,     int,    int,    str,    str,    str # type
+% 12,  3,      1,      0,      2,      2 # length
+[ "sec_interval",      13,     0,      "",     "%2",   "%2"    ]
+[ "sec_interval",      13,     0,      NULL,   NULL,   NULL    ]
+#prepare select cast(? as interval second);
+#prepare select cast(? as interval second);
+% .prepare,    .prepare,       .prepare,       .prepare,       .prepare,       
.prepare # table_name
+% type,        digits, scale,  schema, table,  column # name
+% varchar,     int,    int,    str,    str,    str # type
+% 12,  3,      1,      0,      2,      2 # length
+[ "sec_interval",      13,     0,      "",     "%2",   "%2"    ]
+[ "sec_interval",      13,     0,      NULL,   NULL,   NULL    ]
 #drop schema "myschema" cascade;
 
 # 13:54:02 >  
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to