Changeset: 1bcbc2cab485 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1bcbc2cab485
Modified Files:
sql/server/rel_select.c
sql/test/SQLancer/Tests/sqlancer03.sql
sql/test/SQLancer/Tests/sqlancer03.stable.err
sql/test/SQLancer/Tests/sqlancer03.stable.out
sql/test/miscellaneous/Tests/select_groupby.sql
sql/test/miscellaneous/Tests/select_groupby.stable.err
sql/test/miscellaneous/Tests/select_groupby.stable.out
Branch: default
Log Message:
When an error is found, don't parse further parameters, otherwise wrong error
messages will be sent. Also fixed a crash at an EXEC call with an incompatible
argument type
diffs (213 lines):
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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list