Changeset: 6292908b82d6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6292908b82d6
Modified Files:
sql/server/rel_dump.c
sql/test/SQLancer/Tests/sqlancer19.SQL.py
Branch: Jul2021
Log Message:
Use the same order for exp_read as exp_print so comparison expression get
correctly parsed
diffs (227 lines):
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -932,7 +932,7 @@ read_exp_properties(mvc *sql, sql_exp *e
static sql_exp*
exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *top_exps, char *r, int
*pos, int grp)
{
- int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0,
zero_if_empty = 0;
+ int f = -1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0,
zero_if_empty = 0;
char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r +
*pos, *st;
sql_exp *exp = NULL;
list *exps = NULL;
@@ -1224,10 +1224,25 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
}
}
}
- if (f)
+ if (f) {
exp = exp_op(sql->sa, list_empty(exps) ? NULL :
exps, f);
- else
+ if (is_compare_func(f)) { /* has to parse
any/all */
+ skipWS(r,pos);
+ /* [ ANY|ALL ] */
+ if (strncmp(r+*pos, "ANY",
strlen("ANY")) == 0) {
+ (*pos)+= (int) strlen("ANY");
+ skipWS(r, pos);
+ exp->flag = 1;
+ }
+ if (strncmp(r+*pos, "ALL",
strlen("ALL")) == 0) {
+ (*pos)+= (int) strlen("ALL");
+ skipWS(r, pos);
+ exp->flag = 2;
+ }
+ }
+ } else {
return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000) "Function '%s%s%s %d' not found\n", tname ? tname : "", tname ?
"." : "", cname, nops);
+ }
}
}
@@ -1289,70 +1304,6 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
set_semantics(exp);
}
- /* [ ANY|ALL ] */
- if (strncmp(r+*pos, "ANY", strlen("ANY")) == 0) {
- (*pos)+= (int) strlen("ANY");
- skipWS(r, pos);
- exp->flag = 1;
- }
- if (strncmp(r+*pos, "ALL", strlen("ALL")) == 0) {
- (*pos)+= (int) strlen("ALL");
- skipWS(r, pos);
- exp->flag = 2;
- }
- /* [ ASC ] */
- if (strncmp(r+*pos, "ASC", strlen("ASC")) == 0) {
- (*pos)+= (int) strlen("ASC");
- skipWS(r, pos);
- set_ascending(exp);
- }
- /* [ NULLS LAST ] */
- if (strncmp(r+*pos, "NULLS LAST", strlen("NULLS LAST")) == 0) {
- (*pos)+= (int) strlen("NULLS LAST");
- skipWS(r, pos);
- set_nulls_last(exp);
- }
- /* [ NOT ] NULL */
- if (strncmp(r+*pos, "NOT", strlen("NOT")) == 0) {
- (*pos)+= (int) strlen("NOT");
- skipWS(r, pos);
- not = 1;
- }
- if (strncmp(r+*pos, "NULL", strlen("NULL")) == 0) {
- (*pos)+= (int) strlen("NULL");
- skipWS(r, pos);
- if (not)
- set_has_no_nil(exp);
- }
-
- if (!(exp = read_exp_properties(sql, exp, r, pos)))
- return NULL;
- skipWS(r,pos);
-
- /* as alias */
- if (strncmp(r+*pos, "as", 2) == 0) {
- (*pos)+=2;
- skipWS(r, pos);
-
- tname = r+*pos+1;
- skipIdent(r, pos);
- convertIdent(tname);
- (*pos)++;
- if (r[*pos] != '.') {
- cname = tname;
- exp_setname(sql->sa, exp, NULL, cname);
- skipWS(r, pos);
- } else {
- (*pos)++;
- cname = r+*pos+1;
- skipIdent(r, pos);
- convertIdent(cname);
- (*pos)++;
- skipWS(r, pos);
- exp_setname(sql->sa, exp, tname, cname);
- }
- }
- skipWS(r, pos);
switch(r[*pos]) {
case 'a':
if (strncmp(r+*pos, "any =", strlen("any =")) == 0) {
@@ -1416,11 +1367,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
(*pos)++;
}
break;
- case ',':
- case ']':
- case ')':
default:
- return exp;
+ break;
}
if (f >= 0) {
skipWS(r,pos);
@@ -1428,7 +1376,10 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
list *exps = read_exps(sql, lrel, rrel, top_exps, r,
pos, '(', 0, 0);
if (!exps)
return NULL;
- return exp_in(sql->sa, exp, exps, f);
+ sql_exp *ne = exp_in(sql->sa, exp, exps, f);
+ if (is_anti(exp))
+ set_anti(ne);
+ exp = ne;
} else {
int sym = 0;
sql_exp *e = exp_read(sql, lrel, rrel, top_exps, r,
pos, 0);
@@ -1448,17 +1399,69 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
sql_exp *ne = exp_compare2(sql->sa, e->l, exp,
e->r, compare2range(swap_compare((comp_type)f), e->flag), sym);
if (is_anti(exp))
set_anti(ne);
- return ne;
+ if (exp_name(e)) /* propgate a possible alias
already parsed */
+ exp_prop_alias(sql->sa, exp, e);
+ exp_setalias(e, NULL, NULL);
+ exp = ne;
} else {
sql_exp *ne = exp_compare(sql->sa, exp, e, f);
if (is_anti(exp))
set_anti(ne);
if (is_semantics(exp))
set_semantics(ne);
- return ne;
+ if (exp_name(e)) /* propgate a possible alias
already parsed */
+ exp_prop_alias(sql->sa, exp, e);
+ exp_setalias(e, NULL, NULL);
+ exp = ne;
}
}
}
+
+ /* [ ASC ] */
+ if (strncmp(r+*pos, "ASC", strlen("ASC")) == 0) {
+ (*pos)+= (int) strlen("ASC");
+ skipWS(r, pos);
+ set_ascending(exp);
+ }
+ /* [ NULLS LAST ] */
+ if (strncmp(r+*pos, "NULLS LAST", strlen("NULLS LAST")) == 0) {
+ (*pos)+= (int) strlen("NULLS LAST");
+ skipWS(r, pos);
+ set_nulls_last(exp);
+ }
+ /* [ NOT NULL ] */
+ if (strncmp(r+*pos, "NOT NULL", strlen("NOT NULL")) == 0) {
+ (*pos)+= (int) strlen("NOT NULL");
+ skipWS(r, pos);
+ set_has_no_nil(exp);
+ }
+
+ if (!(exp = read_exp_properties(sql, exp, r, pos)))
+ return NULL;
+
+ /* as alias */
+ if (strncmp(r+*pos, "as", 2) == 0) {
+ (*pos)+=2;
+ skipWS(r, pos);
+
+ tname = r+*pos+1;
+ skipIdent(r, pos);
+ convertIdent(tname);
+ (*pos)++;
+ if (r[*pos] != '.') {
+ cname = tname;
+ exp_setname(sql->sa, exp, NULL, cname);
+ skipWS(r, pos);
+ } else {
+ (*pos)++;
+ cname = r+*pos+1;
+ skipIdent(r, pos);
+ convertIdent(cname);
+ (*pos)++;
+ skipWS(r, pos);
+ exp_setname(sql->sa, exp, tname, cname);
+ }
+ }
return exp;
}
diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
@@ -25,10 +25,14 @@ with SQLTestCase() as cli:
CREATE REMOTE TABLE "rt3" ("c0" BIGINT,"c1" INTERVAL MONTH) ON
'mapi:monetdb://localhost:%s/%s/sys/t3';
COMMIT;""" % (port, db, port, db)).assertSucceeded()
+ cli.execute("START TRANSACTION;")
cli.execute('SELECT json."integer"(JSON \'1\') FROM
rt3;').assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,)])
-
+ cli.execute('SELECT c0 BETWEEN 10 AND 11 FROM
rt3;').assertSucceeded().assertDataResultMatch([(False,),(False,),(False,),(False,),(False,),(False,)])
+ cli.execute('SELECT c0 > 10 as myt, 4 BETWEEN 4 AND 4, c0 = 10 as myp, c0
BETWEEN 1 AND 1 as myp2 FROM rt3 where rt3.c0 = 1;') \
+ .assertSucceeded().assertDataResultMatch([(False,True,False,True)])
cli.execute('MERGE INTO t0 USING (SELECT 1 FROM rt1) AS mergejoined(c0) ON
TRUE WHEN NOT MATCHED THEN INSERT (c0) VALUES (INTERVAL \'5\' SECOND);') \
.assertSucceeded().assertRowCount(0)
+ cli.execute("ROLLBACK;")
cli.execute("""
START TRANSACTION;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list