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