Changeset: d415a8a0cc42 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d415a8a0cc42 Modified Files: sql/server/rel_exp.c sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer07.sql sql/test/SQLancer/Tests/sqlancer07.stable.err sql/test/SQLancer/Tests/sqlancer07.stable.out Branch: octbugs Log Message:
Fixed 2 more prepared statement bugs. When setting the type of a list of atoms, don't set a parameter, because that's wrong. Disallow parameters for is null operator diffs (96 lines): 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 @@ -2939,13 +2939,17 @@ exp_set_list_recurse(mvc *sql, sql_subty if (!e) return 0; + assert(e->type == e_atom); if (e->f) { const char *next_rel = exp_relname(e), *next_exp = exp_name(e); if (next_rel && next_exp && !strcmp(next_rel, *relname) && !strcmp(next_exp, *expname)) for (node *n = ((list *) e->f)->h; n; n = n->next) - exp_set_list_recurse(sql, type, (sql_exp *) n->data, relname, expname); + if (exp_set_list_recurse(sql, type, (sql_exp *) n->data, relname, expname) < 0) + return -1; } - if ((e->f || (!e->l && !e->r && !e->f)) && !e->tpe.type) { + if (e->f && !e->tpe.type) { + e->tpe = *type; + } else if (!e->l && !e->r && !e->f && !e->tpe.type) { if (set_type_param(sql, type, e->flag) == 0) e->tpe = *type; else 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 @@ -2539,10 +2539,13 @@ rel_logical_exp(sql_query *query, sql_re /* is (NOT) NULL */ { sql_exp *le = rel_value_exp(query, &rel, sc->data.sym, f, ek); + sql_subtype *t; if (!le) return NULL; - le = exp_compare(sql->sa, le, exp_atom(sql->sa, atom_general(sql->sa, exp_subtype(le), NULL)), cmp_equal); + if (!(t = exp_subtype(le))) + return sql_error(sql, 01, SQLSTATE(42000) "Cannot have a parameter (?) for IS%s NULL operator", sc->token == SQL_IS_NOT_NULL ? " NOT" : ""); + le = exp_compare(sql->sa, le, exp_atom(sql->sa, atom_general(sql->sa, t, NULL)), cmp_equal); if (sc->token == SQL_IS_NOT_NULL) set_anti(le); set_has_no_nil(le); diff --git a/sql/test/SQLancer/Tests/sqlancer07.sql b/sql/test/SQLancer/Tests/sqlancer07.sql --- a/sql/test/SQLancer/Tests/sqlancer07.sql +++ b/sql/test/SQLancer/Tests/sqlancer07.sql @@ -166,6 +166,12 @@ PREPARE SELECT 1 WHERE greatest(true, ?) PREPARE SELECT (SELECT ? FROM (select 1) as v1(c0)); -- cannot determine parameter type +PREPARE SELECT ?, CASE 'weHtU' WHEN (values (?)) THEN 'G' END; + -- cannot determine parameter type + +PREPARE SELECT DISTINCT ?, CAST(CASE least(?, r'weHtU') WHEN ? THEN ? WHEN ? THEN ? WHEN (VALUES (?)) THEN r'G' ELSE ? END AS DATE) WHERE (?) IS NOT NULL LIMIT 519007555986016405; + -- cannot have a parameter for IS NOT NULL operator + START TRANSACTION; CREATE TABLE "t0" ("c0" INTEGER,"c1" DECIMAL(18,3)); INSERT INTO "t0" VALUES (72238796, 0.553); diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.err b/sql/test/SQLancer/Tests/sqlancer07.stable.err --- a/sql/test/SQLancer/Tests/sqlancer07.stable.err +++ b/sql/test/SQLancer/Tests/sqlancer07.stable.err @@ -40,6 +40,14 @@ MAPI = (monetdb) /var/tmp/mtest-363846/ QUERY = PREPARE SELECT (SELECT ? FROM (select 1) as v1(c0)); ERROR = !Could not determine type for argument number 1 CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-377843/.s.monetdb.38453 +QUERY = PREPARE SELECT ?, CASE 'weHtU' WHEN (values (?)) THEN 'G' END; +ERROR = !Could not determine type for argument number 1 +CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-446274/.s.monetdb.33895 +QUERY = PREPARE SELECT DISTINCT ?, CAST(CASE least(?, r'weHtU') WHEN ? THEN ? WHEN ? THEN ? WHEN (VALUES (?)) THEN r'G' ELSE ? END AS DATE) WHERE (?) IS NOT NULL LIMIT 519007555986016405; +ERROR = !Cannot have a parameter (?) for IS NOT NULL operator +CODE = 42000 # 10:16:14 > # 10:16:14 > "Done." diff --git a/sql/test/SQLancer/Tests/sqlancer07.stable.out b/sql/test/SQLancer/Tests/sqlancer07.stable.out --- a/sql/test/SQLancer/Tests/sqlancer07.stable.out +++ b/sql/test/SQLancer/Tests/sqlancer07.stable.out @@ -232,6 +232,17 @@ stdout of test 'sqlancer07` in directory % 7, 1, 1, 0, 2, 2 # length [ "tinyint", 1, 0, "", "%2", "%2" ] [ "boolean", 1, 0, NULL, NULL, NULL ] +#START TRANSACTION; +#CREATE TABLE "t0" ("c0" INTEGER,"c1" DECIMAL(18,3)); +#INSERT INTO "t0" VALUES (72238796, 0.553); +[ 1 ] +#CREATE TABLE "t1" ("c0" INTEGER); +#INSERT INTO "t1" VALUES (-1302854973), (-1302854973), (107900469), (-292023894); +[ 4 ] +#CREATE TABLE "t2" ("c0" INTEGER); +#INSERT INTO "t2" VALUES (1), (2), (3); +[ 3 ] +#ROLLBACK; # 10:16:14 > # 10:16:14 > "Done." _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list