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