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

Reply via email to