Changeset: d0535dd41f9b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d0535dd41f9b
Modified Files:
        sql/server/rel_select.c
        sql/test/SQLancer/Tests/sqlancer07.sql
        sql/test/SQLancer/Tests/sqlancer07.stable.out
Branch: Oct2020
Log Message:

Making SQLancer happy. Don't move pointer data, instead create a new node


diffs (104 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
@@ -2002,7 +2002,7 @@ not_symbol_can_be_propagated(mvc *sql, s
 }
 
 /* Warning, this function assumes the entire bison tree can be negated, so 
call it after 'not_symbol_can_be_propagated' */
-static void
+static symbol *
 negate_symbol_tree(mvc *sql, symbol *sc)
 {
        switch (sc->token) {
@@ -2039,10 +2039,11 @@ negate_symbol_tree(mvc *sql, symbol *sc)
        case SQL_NOT: { /* nested NOTs eliminate each other */
                if (sc->data.sym->token == SQL_ATOM) {
                        AtomNode *an = (AtomNode*) sc->data.sym;
-                       memmove(sc, an, sizeof(AtomNode));
+                       sc = newAtomNode(sql->sa, an->a);
                } else if (sc->data.sym->token == SQL_SELECT) {
                        SelectNode *sn = (SelectNode*) sc->data.sym;
-                       memmove(sc, sn, sizeof(SelectNode));
+                       sc = newSelectNode(sql->sa, sn->distinct, 
sn->selection, sn->into, sn->from, sn->where, sn->groupby, sn->having,
+                                                          sn->orderby, 
sn->name, sn->limit, sn->offset, sn->sample, sn->seed, sn->window);
                } else {
                        memmove(sc, sc->data.sym, sizeof(symbol));
                }
@@ -2056,13 +2057,14 @@ negate_symbol_tree(mvc *sql, symbol *sc)
        } break;
        case SQL_AND:
        case SQL_OR: {
-               negate_symbol_tree(sql, sc->data.lval->h->data.sym);
-               negate_symbol_tree(sql, sc->data.lval->h->next->data.sym);
+               sc->data.lval->h->data.sym = negate_symbol_tree(sql, 
sc->data.lval->h->data.sym);
+               sc->data.lval->h->next->data.sym= negate_symbol_tree(sql, 
sc->data.lval->h->next->data.sym);
                sc->token = sc->token == SQL_AND ? SQL_OR : SQL_AND;
        } break;
        default:
                break;
        }
+       return sc;
 }
 
 sql_exp *
@@ -2308,7 +2310,7 @@ rel_logical_value_exp(sql_query *query, 
        }
        case SQL_NOT: {
                if (not_symbol_can_be_propagated(sql, sc->data.sym)) {
-                       negate_symbol_tree(sql, sc->data.sym);
+                       sc->data.sym = negate_symbol_tree(sql, sc->data.sym);
                        return rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
                }
                sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
@@ -2603,7 +2605,7 @@ rel_logical_exp(sql_query *query, sql_re
        }
        case SQL_NOT: {
                if (not_symbol_can_be_propagated(sql, sc->data.sym)) {
-                       negate_symbol_tree(sql, sc->data.sym);
+                       sc->data.sym = negate_symbol_tree(sql, sc->data.sym);
                        return rel_logical_exp(query, rel, sc->data.sym, f);
                }
                sql_exp *le = rel_value_exp(query, &rel, sc->data.sym, 
f|sql_farg, ek);
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
@@ -3,3 +3,14 @@ CREATE TABLE "t1" ("c0" DECIMAL(18,3),"c
 PREPARE SELECT DISTINCT (SELECT DISTINCT r'|m<kv' FROM t1 WHERE ((t1.c0)<(?)) 
GROUP BY t1.c2, ?), ?, t1.c2 FROM t1 WHERE CAST(? AS BOOLEAN) LIMIT 
2103332269785059850;
        -- Could not determine type for argument number 2
 ROLLBACK;
+
+START TRANSACTION;
+CREATE TABLE "t0"("c0" INTERVAL MONTH,"c1" INTERVAL SECOND);
+CREATE TABLE "t1"("c0" INTERVAL MONTH,"c1" INTERVAL SECOND);
+CREATE TABLE "t2"("c0" INTERVAL MONTH,"c1" INTERVAL SECOND);
+
+SELECT 1 FROM t1 JOIN t2 ON NOT (NOT (SELECT FALSE FROM t2));
+       -- empty
+SELECT ALL CAST(NOT ((DATE '1970-01-22') NOT IN (DATE '1970-01-04')) AS INT) 
as count FROM t0, t1 FULL OUTER JOIN t2 ON NOT (NOT ((SELECT DISTINCT FALSE 
FROM t2, t0, t1)));
+       -- empty
+ROLLBACK;
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
@@ -8,6 +8,21 @@ stdout of test 'sqlancer07` in directory
 #START TRANSACTION;
 #CREATE TABLE "t1" ("c0" DECIMAL(18,3),"c1" BINARY LARGE OBJECT NOT NULL,"c2" 
DECIMAL(18,3),CONSTRAINT "t1_c1_unique" UNIQUE ("c1"));
 #ROLLBACK;
+#START TRANSACTION;
+#CREATE TABLE "t0"("c0" INTERVAL MONTH,"c1" INTERVAL SECOND);
+#CREATE TABLE "t1"("c0" INTERVAL MONTH,"c1" INTERVAL SECOND);
+#CREATE TABLE "t2"("c0" INTERVAL MONTH,"c1" INTERVAL SECOND);
+#SELECT 1 FROM t1 JOIN t2 ON NOT (NOT (SELECT FALSE FROM t2));
+% .%14 # table_name
+% %14 # name
+% tinyint # type
+% 1 # length
+#SELECT ALL CAST(NOT ((DATE '1970-01-22') NOT IN (DATE '1970-01-04')) AS INT) 
as count FROM t0, t1 FULL OUTER JOIN t2 ON NOT (NOT ((SELECT DISTINCT FALSE 
FROM t2, t0, t1)));
+% . # table_name
+% count # name
+% int # type
+% 1 # length
+#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