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