Changeset: 50e011adfeaf for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=50e011adfeaf Added Files: sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.sql sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.err sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.out sql/test/BugTracker-2017/Tests/crash_in_null_cast.Bug-6186.sql sql/test/BugTracker-2017/Tests/crash_in_null_cast.Bug-6186.stable.err sql/test/BugTracker-2017/Tests/crash_in_null_cast.Bug-6186.stable.out sql/test/BugTracker-2017/Tests/drop_not_null_on_pkey.Bug-6189.sql sql/test/BugTracker-2017/Tests/drop_not_null_on_pkey.Bug-6189.stable.err sql/test/BugTracker-2017/Tests/drop_not_null_on_pkey.Bug-6189.stable.out sql/test/BugTracker-2017/Tests/incorrect_error.Bug-6141.sql sql/test/BugTracker-2017/Tests/incorrect_error.Bug-6141.stable.err sql/test/BugTracker-2017/Tests/incorrect_error.Bug-6141.stable.out sql/test/BugTracker-2017/Tests/oidx-on-strings.Bug-6202.sql sql/test/BugTracker-2017/Tests/oidx-on-strings.Bug-6202.stable.err sql/test/BugTracker-2017/Tests/oidx-on-strings.Bug-6202.stable.out sql/test/BugTracker-2017/Tests/splitpart.Bug-6194.sql sql/test/BugTracker-2017/Tests/splitpart.Bug-6194.stable.err sql/test/BugTracker-2017/Tests/splitpart.Bug-6194.stable.out sql/test/BugTracker-2017/Tests/union_func_crash.Bug-6196.sql sql/test/BugTracker-2017/Tests/union_func_crash.Bug-6196.stable.err sql/test/BugTracker-2017/Tests/union_func_crash.Bug-6196.stable.out Modified Files: monetdb5/mal/Makefile.ag monetdb5/modules/atoms/str.c monetdb5/modules/kernel/mmath.mal monetdb5/modules/mal/orderidx.c monetdb5/modules/mal/pcre.c monetdb5/optimizer/opt_support.c sql/backends/monet5/sql_cat.c sql/server/rel_optimizer.c sql/server/rel_select.c sql/server/sql_mvc.h sql/test/BugTracker-2014/Tests/too_general_errmsg.Bug-3605.stable.err sql/test/BugTracker-2017/Tests/All Branch: data-vaults Log Message:
Merge with default diffs (truncated from 1221 to 300 lines): diff --git a/monetdb5/mal/Makefile.ag b/monetdb5/mal/Makefile.ag --- a/monetdb5/mal/Makefile.ag +++ b/monetdb5/mal/Makefile.ag @@ -54,10 +54,18 @@ headers_h = { HEADERS = h SOURCES = \ mal.h \ + mal_client.h \ mal_errors.h \ mal_exception.h \ + mal_factory.h \ + mal_function.h \ mal_instruction.h \ + mal_interpreter.h \ + mal_listing.h \ + mal_module.h \ mal_namespace.h \ + mal_profiler.h \ + mal_resolve.h \ mal_stack.h \ mal_type.h } diff --git a/monetdb5/modules/atoms/str.c b/monetdb5/modules/atoms/str.c --- a/monetdb5/modules/atoms/str.c +++ b/monetdb5/modules/atoms/str.c @@ -1831,8 +1831,8 @@ STRReverseStrSearch(int *res, const str str STRsplitpart(str *res, str *haystack, str *needle, int *field) { - size_t slen; - int len, f = *field; + size_t len; + int f = *field; char *p; const char *s = *haystack; const char *s2 = *needle; @@ -1848,10 +1848,10 @@ STRsplitpart(str *res, str *haystack, st throw(MAL, "str.splitpart", "field position must be greater than zero"); } - slen = strlen(s2); + len = strlen(s2); while ((p = strstr(s, s2)) != 0 && f > 1) { - s = p + slen; + s = p + len; f--; } @@ -1861,16 +1861,16 @@ STRsplitpart(str *res, str *haystack, st throw(MAL, "str.splitpart", MAL_MALLOC_FAIL); return MAL_SUCCEED; } - + if (p == 0) { - len = UTF8_strlen(s); + len = strlen(s); } else if ((p = strstr(s, s2)) != 0) { - len = (int) (p - s); + len = (size_t) (p - s); } else { - len = UTF8_strlen(s); + len = strlen(s); } - if (len == int_nil || len == 0) { + if (len == 0) { *res = GDKstrdup(""); if (*res == NULL) throw(MAL, "str.splitpart", MAL_MALLOC_FAIL); diff --git a/monetdb5/modules/kernel/mmath.mal b/monetdb5/modules/kernel/mmath.mal --- a/monetdb5/modules/kernel/mmath.mal +++ b/monetdb5/modules/kernel/mmath.mal @@ -194,7 +194,7 @@ unsafe command rand () :int address MATHrandint comment "return a random number"; -command rand (v:int) :int +unsafe command rand (v:int) :int address MATHrandintarg comment "return a random number"; diff --git a/monetdb5/modules/mal/orderidx.c b/monetdb5/modules/mal/orderidx.c --- a/monetdb5/modules/mal/orderidx.c +++ b/monetdb5/modules/mal/orderidx.c @@ -47,6 +47,25 @@ OIDXcreateImplementation(Client cntxt, i if (b->torderidx) return MAL_SUCCEED; + switch (ATOMbasetype(b->ttype)) { + case TYPE_bte: + case TYPE_sht: + case TYPE_int: + case TYPE_lng: +#ifdef HAVE_HGE + case TYPE_hge: +#endif + case TYPE_flt: + case TYPE_dbl: + break; + case TYPE_str: + /* TODO: support strings etc. */ + case TYPE_void: + case TYPE_ptr: + default: + throw(MAL, "bat.orderidx", TYPE_NOT_SUPPORTED); + } + if( pieces < 0 ){ if (GDKnr_threads <= 1) { pieces = 1; diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -319,7 +319,7 @@ static str pcre_likeselect(BAT **bnp, BAT *b, BAT *s, const char *pat, int caseignore, int anti) { #ifdef HAVE_LIBPCRE - int options = PCRE_UTF8 | PCRE_MULTILINE; + int options = PCRE_UTF8 | PCRE_MULTILINE | PCRE_DOTALL; pcre *re; pcre_extra *pe; const char *error; @@ -928,8 +928,14 @@ pcre_match_with_flags(bit *ret, const ch return MAL_SUCCEED; } +#ifdef HAVE_LIBPCRE /* special characters in PCRE that need to be escaped */ static const char *pcre_specials = ".+?*()[]{}|^$\\"; +#else +/* special characters in POSIX basic regular expressions that need to + * be escaped */ +static const char *pcre_specials = ".*[]^$\\"; +#endif /* change SQL LIKE pattern into PCRE pattern */ static str @@ -1068,7 +1074,7 @@ PCREreplace_bat_wrap(bat *res, const bat str PCREmatch(bit *ret, const str *val, const str *pat) { - char *flags = ""; + char *flags = "s"; return pcre_match_with_flags(ret, *val, *pat, flags); } @@ -1294,7 +1300,7 @@ BATPCRElike3(bat *ret, const bat *bid, c #ifdef HAVE_LIBPCRE const char err[BUFSIZ], *err_p = err; int errpos = 0; - int options = PCRE_UTF8; + int options = PCRE_UTF8 | PCRE_DOTALL; pcre *re; #else pcre re; diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c --- a/monetdb5/optimizer/opt_support.c +++ b/monetdb5/optimizer/opt_support.c @@ -278,7 +278,7 @@ isUnsafeFunction(InstrPtr q) } /* - * Instructions are unsafe is one of the arguments is also mentioned + * Instructions are unsafe if one of the arguments is also mentioned * in the result list. Alternatively, the 'unsafe' property is set * for the function call itself. */ diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -591,6 +591,15 @@ alter_table(Client cntxt, mvc *sql, char sql_column *nc = mvc_bind_column(sql, nt, c->base.name); if (c->null != nc->null && isTable(nt)) { + if (c->null && nt->pkey) { /* check for primary keys based on this column */ + node *m; + for(m = nt->pkey->k.columns->h; m; m = m->next) { + sql_kc *kc = m->data; + + if (kc->c->base.id == c->base.id) + return sql_message("40000!NOT NULL CONSTRAINT: cannot change NOT NULL CONSTRAINT for column '%s' as its part of the PRIMARY KEY\n", c->base.name); + } + } mvc_null(sql, nc, c->null); /* for non empty check for nulls */ if (c->null == 0) { @@ -633,8 +642,13 @@ alter_table(Client cntxt, mvc *sql, char if (i->type == ordered_idx) { sql_kc *ic = i->columns->h->data; BAT *b = mvc_bind(sql, nt->s->base.name, nt->base.name, ic->c->base.name, 0); - OIDXcreateImplementation(cntxt, newBatType(b->ttype), b, -1); + char *msg = OIDXcreateImplementation(cntxt, newBatType(b->ttype), b, -1); BBPunfix(b->batCacheid); + if (msg != MAL_SUCCEED) { + char *smsg = sql_message("40002!CREATE ORDERED INDEX: %s", msg); + freeException(msg); + return smsg; + } } if (i->type == imprints_idx) { sql_kc *ic = i->columns->h->data; 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 @@ -3961,7 +3961,7 @@ rel_push_select_down(int *changes, mvc * pl = r->l; /* introduce selects under the project (if needed) */ set_processed(pl); - if (!is_select(pl->op)) + if (!is_select(pl->op) || rel_is_ref(pl)) r->l = pl = rel_select(sql->sa, pl, NULL); /* for each exp check if we can rename it */ @@ -4586,7 +4586,7 @@ rel_push_select_down_union(int *changes, if (u->op == op_project) u = u->l; - if (!u || !is_union(u->op) || !u->exps || rel_is_ref(u)) + if (!u || !is_union(u->op) || need_distinct(u) || !u->exps || rel_is_ref(u)) return rel; ul = u->l; diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -25,7 +25,8 @@ #include "mal.h" /* for have_hge */ #endif -#define check_card(card,f) ((card == card_none && !f->res) || (card != card_none && (f->res || f->func->type == F_FILT)) || card == card_loader) +#define VALUE_FUNC(f) (f->func->type == F_FUNC || f->func->type == F_FILT) +#define check_card(card,f) ((card == card_none && !f->res) || (CARD_VALUE(card) && f->res && VALUE_FUNC(f)) || card == card_loader || (card == card_relation && f->func->type == F_UNION)) static void rel_setsubquery(sql_rel*r) @@ -995,10 +996,15 @@ rel_column_ref(mvc *sql, sql_rel **rel, return rel_var_ref(sql, name, 0); } if (!exp && !var) { - if (rel && *rel && (*rel)->card == CARD_AGGR && f == sql_sel) - return sql_error(sql, 02, "SELECT: cannot use non GROUP BY column '%s' in query results without an aggregate function", name); - else - return sql_error(sql, 02, "SELECT: identifier '%s' unknown", name); + if (rel && *rel && (*rel)->card == CARD_AGGR && f == sql_sel) { + sql_rel *gb = *rel; + + while(gb->l && !is_groupby(gb->op)) + gb = gb->l; + if (gb && gb->l && rel_bind_column(sql, gb->l, name, f)) + return sql_error(sql, 02, "SELECT: cannot use non GROUP BY column '%s' in query results without an aggregate function", name); + } + return sql_error(sql, 02, "SELECT: identifier '%s' unknown", name); } } else if (dlist_length(l) == 2) { @@ -1026,10 +1032,15 @@ rel_column_ref(mvc *sql, sql_rel **rel, } } if (!exp) { - if (rel && *rel && (*rel)->card == CARD_AGGR && f == sql_sel) - return sql_error(sql, 02, "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", tname, cname); - else - return sql_error(sql, 02, "42S22!SELECT: no such column '%s.%s'", tname, cname); + if (rel && *rel && (*rel)->card == CARD_AGGR && f == sql_sel) { + sql_rel *gb = *rel; + + while(gb->l && !is_groupby(gb->op)) + gb = gb->l; + if (gb && gb->l && rel_bind_column2(sql, gb->l, tname, cname, f)) + return sql_error(sql, 02, "SELECT: cannot use non GROUP BY column '%s.%s' in query results without an aggregate function", tname, cname); + } + return sql_error(sql, 02, "42S22!SELECT: no such column '%s.%s'", tname, cname); } } else if (dlist_length(l) >= 3) { return sql_error(sql, 02, "TODO: column names of level >= 3"); diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -30,6 +30,7 @@ #define type_value 0 #define type_predicate 1 +/* todo cleanup card_row and card_set, both seem to be not used */ /* cardinality expected by enclosing operator */ #define card_none -1 /* psm call doesn't return anything */ #define card_value 0 @@ -39,6 +40,7 @@ #define card_relation 4 #define card_loader 5 +#define CARD_VALUE(card) (card == card_value || card == card_row || card == card_column || card == card_set) /* allowed to reduce (in the where and having parts we can reduce) */ diff --git a/sql/test/BugTracker-2014/Tests/too_general_errmsg.Bug-3605.stable.err b/sql/test/BugTracker-2014/Tests/too_general_errmsg.Bug-3605.stable.err --- a/sql/test/BugTracker-2014/Tests/too_general_errmsg.Bug-3605.stable.err +++ b/sql/test/BugTracker-2014/Tests/too_general_errmsg.Bug-3605.stable.err @@ -32,7 +32,7 @@ stderr of test 'too_general_errmsg.Bug-3 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list