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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list