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

Reply via email to