Changeset: f5c86f0b0c90 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f5c86f0b0c90
Modified Files:
sql/server/rel_dump.c
sql/test/SQLancer/Tests/sqlancer19.SQL.py
Branch: Jul2021
Log Message:
Integers sent in the plan don't have the number of digits set, so set it
correctly
diffs (88 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
@@ -935,10 +935,43 @@ read_exp_properties(mvc *sql, sql_exp *e
}
static sql_exp*
+parse_atom(mvc *sql, char *r, int *pos, sql_subtype *tpe)
+{
+ sql_exp *exp = NULL;
+ char *st = readString(r,pos);
+
+ if (st && strcmp(st, "NULL") == 0) {
+ exp = exp_atom(sql->sa, atom_general(sql->sa, tpe, NULL));
+ } else {
+ atom *a = atom_general(sql->sa, tpe, st);
+ if (tpe->type->eclass == EC_NUM) { /* needs to set the number
of digits */
+#ifdef HAVE_HGE
+ hge value = a->data.val.hval;
+ const hge one = 1;
+#else
+ lng value = a->data.val.lval;
+ const lng one = 1;
+#endif
+ int bits = (int) digits2bits(strlen(st)), obits = bits;
+
+ while (bits > 0 && (bits == sizeof(value) * 8 || (one
<< (bits - 1)) > value))
+ bits--;
+ if (bits != obits && (bits == 8 || bits == 16 || bits
== 32 || bits == 64))
+ bits++;
+ a->tpe.digits = bits;
+ } else if (tpe->type->eclass == EC_FLT || tpe->type->eclass ==
EC_DEC) {
+ assert(a->tpe.digits > 0);
+ }
+ exp = exp_atom(sql->sa, a);
+ }
+ return exp;
+}
+
+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, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0,
zero_if_empty = 0, sem = 0, anti = 0;
- char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r +
*pos, *st;
+ char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r + *pos;
sql_exp *exp = NULL;
list *exps = NULL;
sql_type *t = NULL;
@@ -1086,11 +1119,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
skipWS(r, pos);
exp = exp_convert(sql->sa, exp,
exp_subtype(exp), &tpe);
} else {
- st = readString(r,pos);
- if (st && strcmp(st, "NULL") == 0)
- exp = exp_atom(sql->sa,
atom_general(sql->sa, &tpe, NULL));
- else
- exp = exp_atom(sql->sa,
atom_general(sql->sa, &tpe, st));
+ exp = parse_atom(sql, r, pos, &tpe);
skipWS(r, pos);
}
}
@@ -1104,11 +1133,7 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
return sql_error(sql, ERR_NOTFOUND,
SQLSTATE(42000) "SQL type %s not found\n", tname);
sql_init_subtype(&tpe, t, 0, 0);
}
- st = readString(r,pos);
- if (st && strcmp(st, "NULL") == 0)
- exp = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
NULL));
- else
- exp = exp_atom(sql->sa, atom_general(sql->sa, &tpe,
st));
+ exp = parse_atom(sql, r, pos, &tpe);
skipWS(r, pos);
break;
default:
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
@@ -67,6 +67,10 @@ with SQLTestCase() as cli:
.assertSucceeded().assertDataResultMatch([("11",),("22",),("22",),("3",),("3",),("3",)])
cli.execute("SELECT sql_min(rt3.c0 || rt3.c0, 3) as x from rt3 ORDER BY
x;") \
.assertSucceeded().assertDataResultMatch([("11",),("22",),("22",),("3",),("3",),("3",)])
+ cli.execute("SELECT CASE WHEN 1 BETWEEN 1 AND 2 THEN 3*6 END FROM t3 where
t3.c0 = 1;") \
+ .assertSucceeded().assertDataResultMatch([(18,)])
+ cli.execute("SELECT CASE WHEN 1 BETWEEN 1 AND 2 THEN 3*6 END FROM rt3
where rt3.c0 = 1;") \
+ .assertSucceeded().assertDataResultMatch([(18,)])
cli.execute("ROLLBACK;")
cli.execute("""
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list