Changeset: 2041dbb13d2f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2041dbb13d2f
Modified Files:
        monetdb5/modules/atoms/json.c
        sql/server/rel_exp.c
        sql/server/rel_rel.c
        sql/test/json/Tests/All
        sql/test/json/Tests/jsonvalidity.Bug-3753.sql
        sql/test/json/Tests/jsonvalidity.Bug-3753.stable.out
        sql/test/sys-schema/Tests/systemfunctions.stable.out
        sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
        sql/test/testdb/Tests/dump-nogeom.stable.out
Branch: default
Log Message:

Merged with Jun2020


diffs (truncated from 428 to 300 lines):

diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -769,13 +769,13 @@ JSONstringParser(const char *j, const ch
 
 static bool
 JSONintegerParser(const char *j, const char **next) {
-  if (*j == '-')
-    j++;
+       if (*j == '-')
+               j++;
 
-  // skipblancs(j);
-  if (!isdigit((unsigned char)*j)) {
-    *next = j;
-    return false;
+       // skipblancs(j);
+       if (!isdigit((unsigned char)*j)) {
+               *next = j;
+               return false;
        }
 
        if (*j == '0') {
@@ -784,7 +784,7 @@ JSONintegerParser(const char *j, const c
        }
 
        for(; *j; j++)
-               if (!(isdigit((unsigned char) *j) && *j != '0'))
+               if (!(isdigit((unsigned char) *j)))
                        break;
        *next = j;
 
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2274,16 +2274,17 @@ exps_alias(mvc *sql, list *exps)
 }
 
 list *
-exps_copy( mvc *sql, list *exps)
+exps_copy(mvc *sql, list *exps)
 {
-       node *n;
        list *nl;
 
-       if (!exps)
-               return exps;
+       if (THRhighwater())
+               return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
 
+       if (!exps)
+               return NULL;
        nl = new_exp_list(sql->sa);
-       for(n = exps->h; n; n = n->next) {
+       for (node *n = exps->h; n; n = n->next) {
                sql_exp *arg = n->data;
 
                arg = exp_copy(sql, arg);
@@ -2295,10 +2296,15 @@ exps_copy( mvc *sql, list *exps)
 }
 
 sql_exp *
-exp_copy( mvc *sql, sql_exp * e)
+exp_copy(mvc *sql, sql_exp * e)
 {
        sql_exp *l, *r, *r2, *ne = NULL;
 
+       if (THRhighwater())
+               return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
+
+       if (!e)
+               return NULL;
        switch(e->type){
        case e_column:
                ne = exp_column(sql->sa, e->l, e->r, exp_subtype(e), e->card, 
has_nil(e), is_intern(e));
@@ -2308,51 +2314,39 @@ exp_copy( mvc *sql, sql_exp * e)
                if (e->flag == cmp_or || e->flag == cmp_filter) {
                        list *l = exps_copy(sql, e->l);
                        list *r = exps_copy(sql, e->r);
-                       if (l && r) {
-                               if (e->flag == cmp_filter)
-                                       ne = exp_filter(sql->sa, l, r, e->f, 
is_anti(e));
-                               else
-                                       ne = exp_or(sql->sa, l, r, is_anti(e));
-                       }
+
+                       if (e->flag == cmp_filter)
+                               ne = exp_filter(sql->sa, l, r, e->f, 
is_anti(e));
+                       else
+                               ne = exp_or(sql->sa, l, r, is_anti(e));
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
                        sql_exp *l = exp_copy(sql, e->l);
                        list *r = exps_copy(sql, e->r);
 
-                       if (l && r) 
-                               ne = exp_in(sql->sa, l, r, e->flag);
+                       ne = exp_in(sql->sa, l, r, e->flag);
                } else {
                        l = exp_copy(sql, e->l);
                        r = exp_copy(sql, e->r);
 
                        if (e->f) {
                                r2 = exp_copy(sql, e->f);
-                               if (l && r && r2)
-                                       ne = exp_compare2(sql->sa, l, r, r2, 
e->flag);
-                       } else if (l && r) {
+                               ne = exp_compare2(sql->sa, l, r, r2, e->flag);
+                       } else {
                                ne = exp_compare(sql->sa, l, r, e->flag);
                        }
                }
                break;
        case e_convert:
-               l = exp_copy(sql, e->l);
-               if (l)
-                       ne = exp_convert(sql->sa, l, exp_fromtype(e), 
exp_totype(e));
+               ne = exp_convert(sql->sa, exp_copy(sql, e->l), exp_fromtype(e), 
exp_totype(e));
                break;
        case e_aggr:
        case e_func: {
-               list *l = e->l, *nl = NULL;
+               list *l = exps_copy(sql, e->l);
 
-               if (!l) {
-                       return e;
-               } else {
-                       nl = exps_copy(sql, l);
-                       if (!nl)
-                               return NULL;
-               }
                if (e->type == e_func)
-                       ne = exp_op(sql->sa, nl, e->f);
+                       ne = exp_op(sql->sa, l, e->f);
                else 
-                       ne = exp_aggr(sql->sa, nl, e->f, need_distinct(e), 
need_no_nil(e), e->card, has_nil(e));
+                       ne = exp_aggr(sql->sa, l, e->f, need_distinct(e), 
need_no_nil(e), e->card, has_nil(e));
                break;
        }       
        case e_atom:
@@ -2366,10 +2360,24 @@ exp_copy( mvc *sql, sql_exp * e)
                        ne = exp_atom_ref(sql->sa, e->flag, &e->tpe);
                break;
        case e_psm:
-               if (e->flag & PSM_SET) 
+               if (e->flag & PSM_SET) {
                        ne = exp_set(sql->sa, e->alias.name, exp_copy(sql, 
e->l), GET_PSM_LEVEL(e->flag));
-               if (e->flag & PSM_REL)
+               } else if (e->flag & PSM_VAR) {
+                       if (e->f)
+                               ne = exp_table(sql->sa, e->alias.name, e->f, 
GET_PSM_LEVEL(e->flag));
+                       else
+                               ne = exp_var(sql->sa, e->alias.name, &e->tpe, 
GET_PSM_LEVEL(e->flag));
+               } else if (e->flag & PSM_RETURN) {
+                       ne = exp_return(sql->sa, exp_copy(sql, e->l), 
GET_PSM_LEVEL(e->flag));
+               } else if (e->flag & PSM_WHILE) {
+                       ne = exp_while(sql->sa, exp_copy(sql, e->l), 
exps_copy(sql, e->r));
+               } else if (e->flag & PSM_IF) {
+                       ne = exp_if(sql->sa, exp_copy(sql, e->l), 
exps_copy(sql, e->r), exps_copy(sql, e->f));
+               } else if (e->flag & PSM_REL) {
                        return exp_ref(sql, e);
+               } else if (e->flag & PSM_EXCEPTION) {
+                       ne = exp_exception(sql->sa, exp_copy(sql, e->l), 
sa_strdup(sql->sa, (const char *) e->r));
+               }
                break;
        }
        if (!ne)
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -116,7 +116,7 @@ rel_destroy(sql_rel *rel)
 }
 
 sql_rel*
-rel_create( sql_allocator *sa )
+rel_create(sql_allocator *sa)
 {
        sql_rel *r = SA_NEW(sa, sql_rel);
        if(!r)
@@ -130,10 +130,15 @@ rel_create( sql_allocator *sa )
 }
 
 sql_rel *
-rel_copy( mvc *sql, sql_rel *i, int deep )
+rel_copy(mvc *sql, sql_rel *i, int deep)
 {
-       sql_rel *rel = rel_create(sql->sa);
-       if(!rel)
+       sql_rel *rel;
+
+       if (THRhighwater())
+               return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: 
running out of stack space");
+
+       rel = rel_create(sql->sa);
+       if (!rel)
                return NULL;
 
        rel->l = NULL;
@@ -149,28 +154,52 @@ rel_copy( mvc *sql, sql_rel *i, int deep
                rel->l = i->l;
                rel->r = i->r;
                break;
+       case op_project:
        case op_groupby:
                rel->l = rel_copy(sql, i->l, deep);
                if (i->r) {
                        if (!deep) {
                                rel->r = list_dup(i->r, (fdup) NULL);
                        } else {
-                               list* l = (list*)i->r;
+                               list *l = (list*)i->r;
                                rel->r = list_new(l->sa, l->destroy);
-                               for(node *n = l->h ; n ; n = n->next)
+                               for (node *n = l->h ; n ; n = n->next)
                                        list_append(rel->r, rel_copy(sql, 
(sql_rel *)n->data, deep));
                        }
                }
                break;
+       case op_ddl:
+               if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq) {
+                       if (i->l)
+                               rel->l = rel_copy(sql, i->l, deep);
+               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
+                       if (i->l)
+                               rel->l = rel_copy(sql, i->l, deep);
+                       if (i->r)
+                               rel->r = rel_copy(sql, i->r, deep);
+               }
+               break;
+       case op_select:
+       case op_topn:
+       case op_sample:
+       case op_truncate:
+               if (i->l)
+                       rel->l = rel_copy(sql, i->l, deep);
+               break;
+       case op_insert:
+       case op_update:
+       case op_delete:
+
        case op_join:
        case op_left:
        case op_right:
        case op_full:
        case op_semi:
        case op_anti:
-       case op_project:
-       case op_select:
-       default:
+
+       case op_union:
+       case op_inter:
+       case op_except:
                if (i->l)
                        rel->l = rel_copy(sql, i->l, deep);
                if (i->r)
@@ -1679,7 +1708,7 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
                            exps_deps(sql, e->r, refs, l) != 0)
                                return -1;
                        if (e->flag & PSM_IF && e->f)
-                           return exps_deps(sql, e->r, refs, l);
+                               return exps_deps(sql, e->r, refs, l);
                } else if (e->flag & PSM_REL) {
                        sql_rel *rel = e->l;
                        return rel_deps(sql, rel, refs, l);
@@ -1797,7 +1826,11 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
        case op_anti:
        case op_union: 
        case op_except: 
-       case op_inter: 
+       case op_inter:
+
+       case op_insert: 
+       case op_update: 
+       case op_delete:
                if (rel_deps(sql, r->l, refs, l) != 0 ||
                    rel_deps(sql, r->r, refs, l) != 0)
                        return -1;
@@ -1807,29 +1840,18 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
        case op_groupby: 
        case op_topn: 
        case op_sample:
+       case op_truncate:
                if (rel_deps(sql, r->l, refs, l) != 0)
                        return -1;
                break;
-       case op_insert: 
-       case op_update: 
-       case op_delete:
-       case op_truncate:
-               if (rel_deps(sql, r->l, refs, l) != 0 ||
-                   rel_deps(sql, r->r, refs, l) != 0)
-                       return -1;
-               break;
        case op_ddl:
-               if (r->flag == ddl_output) {
-                       if (r->l)
-                               return rel_deps(sql, r->l, refs, l);
+               if (r->flag == ddl_output || r->flag == ddl_create_seq || 
r->flag == ddl_alter_seq) {
+                       if (rel_deps(sql, r->l, refs, l) != 0)
+                               return -1;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to