Changeset: 65a67c23c2c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=65a67c23c2c1
Added Files:
sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.sql
sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.err
sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.out
sql/test/json/Tests/jsonkeyarray.Bug-6858.sql
sql/test/json/Tests/jsontext.Bug-6859.sql
Modified Files:
monetdb5/modules/atoms/url.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_round_impl.h
sql/server/rel_optimizer.c
sql/server/sql_parser.y
sql/test/BugTracker-2012/Tests/url_script_test.Bug-2972.stable.out
sql/test/BugTracker-2020/Tests/All
sql/test/SQLancer/Tests/SingleServer
sql/test/SQLancer/Tests/sqlancer01.sql
sql/test/SQLancer/Tests/sqlancer01.stable.err
sql/test/SQLancer/Tests/sqlancer01.stable.out
sql/test/json/Tests/All
Branch: default
Log Message:
Merged with Jun2020
diffs (truncated from 612 to 300 lines):
diff --git a/monetdb5/modules/atoms/url.c b/monetdb5/modules/atoms/url.c
--- a/monetdb5/modules/atoms/url.c
+++ b/monetdb5/modules/atoms/url.c
@@ -637,25 +637,31 @@ URLgetRobotURL(str *retval, url *val)
return MAL_SUCCEED;
}
-
/* COMMAND "getUser": Extract the user identity from the URL
* SIGNATURE: getUser(str) : str; */
str
URLgetUser(str *retval, url *val)
{
- const char *s;
- const char *p;
- const char *u;
+ const char *s, *h, *u, *p;
if (val == NULL || *val == NULL)
throw(ILLARG, "url.getUser", "url missing");
if ((s = skip_scheme(*val)) == NULL ||
- (p = skip_authority(s, &u, NULL, NULL, NULL)) == NULL)
- throw(ILLARG, "url.getUser", "bad url");
- if (u == s || !u) {
+ (s = skip_authority(s, &u, &p, &h, NULL)) == NULL)
+ throw(ILLARG, "url.getHost", "bad url");
+ if (u == NULL || h == NULL) {
*retval = GDKstrdup(str_nil);
} else {
- *retval = GDKstrdup(u);
+ size_t l;
+
+ if (p) {
+ l = p - u - 1;
+ } else {
+ l = h - u - 1;
+ }
+ if ((*retval = GDKmalloc(l + 1)) != NULL) {
+ strcpy_len(*retval, u, l + 1);
+ }
}
if (*retval == NULL)
throw(MAL, "url.getUser", SQLSTATE(HY013) MAL_MALLOC_FAIL);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1111,11 +1111,14 @@ exp_bin(backend *be, sql_exp *e, stmt *l
}
} else {
/* value compare or select */
- if (!reduce || (l->nrcols == 0 && r->nrcols ==
0 && (e->flag == mark_in || e->flag == mark_notin))) {
- sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, "=", tail_type(l), tail_type(l), F_FUNC);
+ if ((!reduce || (l->nrcols == 0 && r->nrcols ==
0)) && (e->flag == mark_in || e->flag == mark_notin)) {
+ int in_flag = e->flag==mark_in?1:0;
+ if (e->anti)
+ in_flag = !in_flag;
+ sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema, in_flag?"=":"<>", tail_type(l), tail_type(l), F_FUNC);
assert(f);
s = stmt_binop(be, l, r, f);
- } else if (l->nrcols == 0 && r->nrcols == 0) {
+ } else if (!reduce || (l->nrcols == 0 &&
r->nrcols == 0)) {
sql_subfunc *f = sql_bind_func(sql->sa,
sql->session->schema,
compare_func((comp_type)e->flag, is_anti(e)),
tail_type(l),
tail_type(l), F_FUNC);
@@ -2218,8 +2221,8 @@ rel2bin_join(backend *be, sql_rel *rel,
sql_exp *e = en->data;
/* we can handle thetajoins, rangejoins and
filter joins (like) */
- /* ToDo how about in/notin, mark_in/notin,
mark_exists/not_exists */
- if (e->type <= e_cmp) {
+ /* ToDo how about in/notin, mark_in/notin,
mark_exists/not_exists and atom expressions? */
+ if (e->type == e_cmp) {
int flag = e->flag & ~CMP_BETWEEN;
/* check if its a select or join
expression, ie use only expressions of one relation left and of the other right
(than join) */
if (flag < cmp_filter && !e->f) { /*
theta join */
@@ -2242,7 +2245,7 @@ rel2bin_join(backend *be, sql_rel *rel,
append(jexps, e);
continue;
}
- } else if (e->flag == cmp_filter) {
+ } else if (flag == cmp_filter) {
int nrcl = 0, nrcr = 0;
bool fll = true, flr = true,
frl = true, frr = true;
list *l = e->l, *r = e->r;
@@ -2266,9 +2269,7 @@ rel2bin_join(backend *be, sql_rel *rel,
append(jexps, e);
continue;
}
-
}
-
}
append(sexps, e);
}
diff --git a/sql/backends/monet5/sql_round_impl.h
b/sql/backends/monet5/sql_round_impl.h
--- a/sql/backends/monet5/sql_round_impl.h
+++ b/sql/backends/monet5/sql_round_impl.h
@@ -52,6 +52,8 @@ dec_round_wrap(TYPE *res, const TYPE *v,
/* basic sanity checks */
assert(res && v && r);
+ if (*r <= 0)
+ throw(MAL, "round", SQLSTATE(42000) "Argument 2 to round
function must be positive");
*res = dec_round_body(*v, *r);
return MAL_SUCCEED;
}
@@ -67,6 +69,8 @@ bat_dec_round_wrap(bat *_res, const bat
/* basic sanity checks */
assert(_res && _v && r);
+ if (*r <= 0)
+ throw(MAL, "round", SQLSTATE(42000) "Argument 2 to round
function must be positive");
/* get argument BAT descriptor */
if ((v = BATdescriptor(*_v)) == NULL)
throw(MAL, "round", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -7630,20 +7630,22 @@ rel_simplify_predicates(mvc *sql, sql_re
if (is_func(inner->type) &&
!inf->func->s &&
is_not_func(inf)) {
- int anti = is_anti(e);
+ int anti = is_anti(e),
is_semantics = is_semantics(e);
args = inner->l;
assert(list_length(args) == 1);
l = args->h->data;
e =
exp_compare(sql->sa, l, r, e->flag);
if (anti) set_anti(e);
+ if (is_semantics)
set_semantics(e);
(*changes)++;
- /* rewrite not(=/<>(a,b)) =
TRUE/FALSE => a=b of a<>b */
+ /* rewrite not(=/<>(a,b)) =
TRUE/FALSE => a=b / a<>b */
} else if (is_func(inner->type)
&&
!inf->func->s &&
(!strcmp(inf->func->base.name, "=") ||
-
!strcmp(inf->func->base.name, "<>"))) {
+
!strcmp(inf->func->base.name, "<>"))) {
int flag =
a->data.val.bval;
+ sql_exp *ne;
args = inner->l;
if
(!strcmp(inf->func->base.name, "<>"))
@@ -7651,16 +7653,22 @@ rel_simplify_predicates(mvc *sql, sql_re
assert(list_length(args) == 2);
l = args->h->data;
r = args->h->next->data;
- e =
exp_compare(sql->sa, l, r, (!flag)?cmp_equal:cmp_notequal);
+ ne =
exp_compare(sql->sa, l, r, (!flag)?cmp_equal:cmp_notequal);
+ if (a->isnull)
+ e->l = ne;
+ else
+ e = ne;
(*changes)++;
} else if (a && a->data.vtype
== TYPE_bit) {
- int anti = is_anti(e);
+ int anti = is_anti(e),
is_semantics = is_semantics(e);
/* change atom's value
on right */
l = args->h->data;
- a->data.val.bval =
!a->data.val.bval;
+ if (!a->isnull)
+
a->data.val.bval = !a->data.val.bval;
e =
exp_compare(sql->sa, l, r, e->flag);
if (anti) set_anti(e);
+ if (is_semantics)
set_semantics(e);
(*changes)++;
}
}
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -1589,7 +1589,7 @@ partition_type:
;
partition_expression:
- simple_scalar_exp { $$ = $1; }
+ search_condition { $$ = $1; }
;
partition_on:
@@ -1619,16 +1619,16 @@ opt_partition_by:
;
partition_list_value:
- simple_scalar_exp { $$ = $1; }
+ search_condition { $$ = $1; }
;
partition_range_from:
- simple_scalar_exp { $$ = $1; }
+ search_condition { $$ = $1; }
| RANGE MINVALUE { $$ = _symbol_create(SQL_MINVALUE, NULL ); }
;
partition_range_to:
- simple_scalar_exp { $$ = $1; }
+ search_condition { $$ = $1; }
| RANGE MAXVALUE { $$ = _symbol_create(SQL_MAXVALUE, NULL ); }
;
@@ -1836,7 +1836,7 @@ default:
;
default_value:
- simple_scalar_exp { $$ = $1; }
+ search_condition { $$ = $1; }
;
column_constraint:
diff --git a/sql/test/BugTracker-2012/Tests/url_script_test.Bug-2972.stable.out
b/sql/test/BugTracker-2012/Tests/url_script_test.Bug-2972.stable.out
--- a/sql/test/BugTracker-2012/Tests/url_script_test.Bug-2972.stable.out
+++ b/sql/test/BugTracker-2012/Tests/url_script_test.Bug-2972.stable.out
@@ -126,8 +126,8 @@ stdout of test 'url_script_test.Bug-2972
% sys.%1 # table_name
% %1 # name
% clob # type
-% 2 # length
-[ "mk" ]
+% 0 # length
+[ NULL ]
[ NULL ]
[ NULL ]
#select getRobotURL(u) from t2972;
diff --git a/sql/test/BugTracker-2020/Tests/All
b/sql/test/BugTracker-2020/Tests/All
--- a/sql/test/BugTracker-2020/Tests/All
+++ b/sql/test/BugTracker-2020/Tests/All
@@ -7,6 +7,7 @@ NOT_WIN32&HAVE_LIBR&HAVE_LIBPY3?function
cume-dist-wrong-results.Bug-6827
window-order-by-extract.Bug-6828
ntile-wrong-results.Bug-6829
+url-getuser.Bug-6844
HAVE_PYMONETDB?global_table_propagation.Bug-6846
ilike-matches.Bug-6864
select-and.Bug-6878
diff --git a/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.sql
b/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.sql
@@ -0,0 +1,6 @@
+select sys.getUser('https://me:[email protected]/Doc');
+ -- me
+select sys.getUser('http://[email protected]/vision2011.pdf');
+ -- mk
+select sys.getUser('http://www.cwi.nl/~mk/vision2011.pdf');
+ -- NULL
diff --git a/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.err
b/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.err
@@ -0,0 +1,12 @@
+stderr of test 'url-getuser.Bug-6844` in directory 'sql/test/BugTracker-2020`
itself:
+
+
+# 18:53:36 >
+# 18:53:36 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-431784" "--port=35988"
+# 18:53:36 >
+
+
+# 18:53:36 >
+# 18:53:36 > "Done."
+# 18:53:36 >
+
diff --git a/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.out
b/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/url-getuser.Bug-6844.stable.out
@@ -0,0 +1,30 @@
+stdout of test 'url-getuser.Bug-6844` in directory 'sql/test/BugTracker-2020`
itself:
+
+
+# 18:53:36 >
+# 18:53:36 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-431784" "--port=35988"
+# 18:53:36 >
+
+#select sys.getUser('https://me:[email protected]/Doc');
+% .%2 # table_name
+% %2 # name
+% clob # type
+% 2 # length
+[ "me" ]
+#select sys.getUser('http://[email protected]/vision2011.pdf');
+% .%2 # table_name
+% %2 # name
+% clob # type
+% 2 # length
+[ "mk" ]
+#select sys.getUser('http://www.cwi.nl/~mk/vision2011.pdf');
+% .%2 # table_name
+% %2 # name
+% clob # type
+% 0 # length
+[ NULL ]
+
+# 18:53:36 >
+# 18:53:36 > "Done."
+# 18:53:36 >
+
diff --git a/sql/test/SQLancer/Tests/SingleServer
b/sql/test/SQLancer/Tests/SingleServer
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list