Changeset: 307ad86942f9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/307ad86942f9 Modified Files: sql/backends/monet5/sql.c sql/server/rel_optimizer.c sql/test/emptydb/Tests/check.stable.out sql/test/emptydb/Tests/check.stable.out.32bit sql/test/emptydb/Tests/check.stable.out.int128 Branch: default Log Message:
Merged with Jul2021 diffs (truncated from 875 to 300 lines): diff --git a/monetdb5/modules/kernel/bat5.c b/monetdb5/modules/kernel/bat5.c --- a/monetdb5/modules/kernel/bat5.c +++ b/monetdb5/modules/kernel/bat5.c @@ -790,7 +790,7 @@ BKCgetSequenceBase(oid *r, const bat *bi */ #define shrinkloop(Type) \ do { \ - const Type *restrict in = (Type*)bi.base; \ + const Type *in = (Type*)bi.base; \ Type *restrict r = (Type*)Tloc(bn, 0); \ for (;p<q; oidx++, p++) { \ if ( o < ol && *o == oidx ){ \ @@ -870,6 +870,7 @@ BKCshrinkBAT(bat *ret, const bat *bid, c const int8_t *restrict src = (int8_t*) bi.base; int8_t *restrict dst = (int8_t*) Tloc(bn, 0); + assert(b->ttype != TYPE_oid); /* because of 'restrict', the oid case can't fall here */ for (;p<q; oidx++, p++) { if (o < ol && *o == oidx) { o++; diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -319,39 +319,36 @@ create_table_or_view(mvc *sql, char *sna str msg = MAL_SUCCEED; if (store_readonly(sql->session->tr->store)) - return sql_error(sql, 06, SQLSTATE(25006) "schema statements cannot be executed on a readonly database."); + throw(SQL, "sql.catalog", SQLSTATE(25006) "schema statements cannot be executed on a readonly database."); if (!s) - return sql_error(sql, 02, SQLSTATE(3F000) "%s %s: schema '%s' doesn't exist", action, obj, sname); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "%s %s: schema '%s' doesn't exist", action, obj, sname); if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))) - return sql_error(sql, 02, SQLSTATE(42000) "%s %s: insufficient privileges for user '%s' in schema '%s'", + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: insufficient privileges for user '%s' in schema '%s'", action, obj, get_string_global_var(sql, "current_user"), s->base.name); if ((ot = mvc_bind_table(sql, s, t->base.name))) { if (replace) { if (ot->type != t->type) - return sql_error(sql, 02, SQLSTATE(42000) "%s %s: unable to drop %s '%s': is a %s", + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: unable to drop %s '%s': is a %s", action, obj, obj, t->base.name, TABLE_TYPE_DESCRIPTION(ot->type, ot->properties)); if (ot->system) - return sql_error(sql, 02, SQLSTATE(42000) "%s %s: cannot replace system %s '%s'", action, obj, obj, t->base.name); + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: cannot replace system %s '%s'", action, obj, obj, t->base.name); if (mvc_check_dependency(sql, ot->base.id, isView(ot) ? VIEW_DEPENDENCY : TABLE_DEPENDENCY, NULL)) - return sql_error(sql, 02, SQLSTATE(42000) "%s %s: cannot replace %s '%s', there are database objects which depend on it", + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: cannot replace %s '%s', there are database objects which depend on it", action, obj, obj, t->base.name); - if ((msg = mvc_drop_table(sql, s, ot, 0)) != MAL_SUCCEED) { - sql_error(sql, 02, "%s", msg); - freeException(msg); - return NULL; - } + if ((msg = mvc_drop_table(sql, s, ot, 0)) != MAL_SUCCEED) + return msg; } else { - return sql_error(sql, 02, SQLSTATE(42S01) "%s %s: name '%s' already in use", action, obj, t->base.name); + throw(SQL, "sql.catalog", SQLSTATE(42S01) "%s %s: name '%s' already in use", action, obj, t->base.name); } } if (temp == SQL_DECLARED_TABLE && ol_length(t->keys)) - return sql_error(sql, 02, SQLSTATE(42000) "%s %s: '%s' cannot have constraints", action, obj, t->base.name); + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: '%s' cannot have constraints", action, obj, t->base.name); nt = sql_trans_create_table(sql->session->tr, s, tname, t->query, t->type, t->system, temp, t->commit_action, t->sz, t->properties); if (!nt) - return sql_error(sql, 02, SQLSTATE(42000) "%s %s: '%s' name conflicts", action, obj, t->base.name); + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: '%s' name conflicts", action, obj, t->base.name); osa = sql->sa; sql->sa = sql->ta; @@ -578,11 +575,11 @@ create_table_from_emit(Client cntxt, cha if (!sname) sname = "sys"; if (!(s = mvc_bind_schema(sql, sname))) - return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: no such schema '%s'", sname); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: no such schema '%s'", sname); if (!mvc_schema_privs(sql, s)) - return sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE: Access denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), s->base.name); + throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: Access denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), s->base.name); if (!(t = mvc_create_table(sql, s, tname, tt_table, 0, SQL_DECLARED_TABLE, CA_COMMIT, -1, 0))) - return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: could not create table '%s'", tname); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not create table '%s'", tname); for (i = 0; i < ncols; i++) { BAT *b = columns[i].b; @@ -595,30 +592,30 @@ create_table_from_emit(Client cntxt, cha else { sql_subtype *t = sql_bind_localtype(atoname); if (!t) - return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: could not find type for column"); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not find type for column"); tpe = *t; } if (columns[i].name && columns[i].name[0] == '%') - return sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE: generated labels not allowed in column names, use an alias instead"); + throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: generated labels not allowed in column names, use an alias instead"); if (!(col = mvc_create_column(sql, t, columns[i].name, &tpe))) - return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: could not create column %s", columns[i].name); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not create column %s", columns[i].name); } if ((msg = create_table_or_view(sql, sname, t->base.name, t, 0, 0)) != MAL_SUCCEED) return msg; if (!(t = mvc_bind_table(sql, s, tname))) - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "CREATE TABLE: could not bind table %s", tname); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not bind table %s", tname); BUN offset; BAT *pos = NULL; if (mvc_claim_slots(sql->session->tr, t, BATcount(columns[0].b), &offset, &pos) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE: Could not insert data"); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: Could not insert data"); for (i = 0; i < ncols; i++) { BAT *b = columns[i].b; sql_column *col = NULL; if (!(col = mvc_bind_column(sql, t, columns[i].name))) { bat_destroy(pos); - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "CREATE TABLE: could not bind column %s", columns[i].name); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not bind column %s", columns[i].name); } if ((msg = mvc_append_column(sql->session->tr, col, offset, pos, b)) != MAL_SUCCEED) { bat_destroy(pos); @@ -646,20 +643,20 @@ append_to_table_from_emit(Client cntxt, if (!sname) sname = "sys"; if (!(s = mvc_bind_schema(sql, sname))) - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "APPEND TABLE: no such schema '%s'", sname); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "APPEND TABLE: no such schema '%s'", sname); if (!(t = mvc_bind_table(sql, s, tname))) - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "APPEND TABLE: could not bind table %s", tname); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "APPEND TABLE: could not bind table %s", tname); BUN offset; BAT *pos = NULL; if (mvc_claim_slots(sql->session->tr, t, BATcount(columns[0].b), &offset, &pos) != LOG_OK) - return sql_error(sql, 02, SQLSTATE(3F000) "APPEND TABLE: Could not append data"); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "APPEND TABLE: Could not append data"); for (i = 0; i < ncols; i++) { BAT *b = columns[i].b; sql_column *col = NULL; if (!(col = mvc_bind_column(sql, t, columns[i].name))) { bat_destroy(pos); - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "APPEND TABLE: could not bind column %s", columns[i].name); + throw(SQL, "sql.catalog", SQLSTATE(3F000) "APPEND TABLE: could not bind column %s", columns[i].name); } if ((msg = mvc_append_column(sql->session->tr, col, offset, pos, b)) != MAL_SUCCEED) { bat_destroy(pos); @@ -694,16 +691,6 @@ mvc_bind(mvc *m, const char *sname, cons return b; } -str -SQLcatalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) -{ - (void) cntxt; - (void) mb; - (void) stk; - (void) pci; - return sql_message(SQLSTATE(25006) "Deprecated statement"); -} - /* setVariable(int *ret, str *sname, str *name, any value) */ str setVariable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h --- a/sql/backends/monet5/sql.h +++ b/sql/backends/monet5/sql.h @@ -61,7 +61,6 @@ extern str SQLmvc(Client cntxt, MalBlkPt extern str SQLcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str SQLabort(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str SQLtransaction2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); -extern str SQLcatalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str mvc_grow_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); extern str mvc_claim_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); 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 @@ -4714,51 +4714,30 @@ rel_push_select_down(visitor *v, sql_rel } /* try push select under set relation */ - if (is_select(rel->op) && r && !rel_is_ref(r) && !is_single(r) && !list_empty(exps)) { - sql_rel *u = r, *ou = u; - sql_rel *ul = u->l; - sql_rel *ur = u->r; - - if (!rel_is_ref(u) && !is_single(u) && u->op == op_project) - u = u->l; - - if (u && is_set(u->op) && !is_single(u) && !list_empty(u->exps) && !rel_is_ref(u)) { - ul = u->l; - ur = u->r; - - ul = rel_dup(ul); - ur = rel_dup(ur); - if (!is_project(ul->op)) - ul = rel_project(v->sql->sa, ul, - rel_projections(v->sql, ul, NULL, 1, 1)); - if (!is_project(ur->op)) - ur = rel_project(v->sql->sa, ur, - rel_projections(v->sql, ur, NULL, 1, 1)); - rel_rename_exps(v->sql, u->exps, ul->exps); - rel_rename_exps(v->sql, u->exps, ur->exps); - - if (u != ou) { - ul = rel_project(v->sql->sa, ul, NULL); - ul->exps = exps_copy(v->sql, ou->exps); - rel_rename_exps(v->sql, ou->exps, ul->exps); - set_processed(ul); - ur = rel_project(v->sql->sa, ur, NULL); - ur->exps = exps_copy(v->sql, ou->exps); - rel_rename_exps(v->sql, ou->exps, ur->exps); - set_processed(ur); - } - - /* introduce selects under the set */ - ul = rel_select(v->sql->sa, ul, NULL); - ul->exps = exps_copy(v->sql, exps); - ur = rel_select(v->sql->sa, ur, NULL); - ur->exps = exps_copy(v->sql, exps); - - rel = rel_inplace_setop(v->sql, rel, ul, ur, u->op, rel_projections(v->sql, rel, NULL, 1, 1)); - if (need_distinct(u)) - set_distinct(rel); - v->changes++; - } + if (is_select(rel->op) && r && is_set(r->op) && !list_empty(r->exps) && !rel_is_ref(r) && !is_single(r) && !list_empty(exps)) { + sql_rel *u = r, *ul = u->l, *ur = u->r; + + ul = rel_dup(ul); + ur = rel_dup(ur); + if (!is_project(ul->op)) + ul = rel_project(v->sql->sa, ul, + rel_projections(v->sql, ul, NULL, 1, 1)); + if (!is_project(ur->op)) + ur = rel_project(v->sql->sa, ur, + rel_projections(v->sql, ur, NULL, 1, 1)); + rel_rename_exps(v->sql, u->exps, ul->exps); + rel_rename_exps(v->sql, u->exps, ur->exps); + + /* introduce selects under the set */ + ul = rel_select(v->sql->sa, ul, NULL); + ul->exps = exps_copy(v->sql, exps); + ur = rel_select(v->sql->sa, ur, NULL); + ur->exps = exps_copy(v->sql, exps); + + rel = rel_inplace_setop(v->sql, rel, ul, ur, u->op, rel_projections(v->sql, rel, NULL, 1, 1)); + if (need_distinct(u)) + set_distinct(rel); + v->changes++; } return try_remove_empty_select(v, rel); diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -1766,11 +1766,11 @@ copyfromloader(sql_query *query, dlist * list *mts; if (!copy_allowed(sql, 1)) - return sql_error(sql, 02, SQLSTATE(42000) "COPY INTO: insufficient privileges: " - "binary COPY INTO requires database administrator rights"); + return sql_error(sql, 02, SQLSTATE(42000) "COPY LOADER INTO: insufficient privileges: " + "COPY LOADER INTO requires database administrator rights"); t = find_table_or_view_on_scope(sql, NULL, sname, tname, "COPY INTO", false); //TODO the COPY LOADER INTO should return an insert relation (instead of ddl) to handle partitioned tables properly - if (insert_allowed(sql, t, tname, "COPY INTO", "copy into") == NULL) + if (insert_allowed(sql, t, tname, "COPY LOADER INTO", "copy loader into") == NULL) return NULL; if (isPartitionedByColumnTable(t) || isPartitionedByExpressionTable(t)) return sql_error(sql, 02, SQLSTATE(42000) "COPY LOADER INTO: not possible for partitioned tables at the moment"); diff --git a/sql/test/SQLancer/Tests/All b/sql/test/SQLancer/Tests/All --- a/sql/test/SQLancer/Tests/All +++ b/sql/test/SQLancer/Tests/All @@ -14,4 +14,5 @@ sqlancer13 sqlancer14 sqlancer15 sqlancer16 -KNOWNFAIL?sqlancer17 +sqlancer17 +KNOWNFAIL?sqlancer18 diff --git a/sql/test/SQLancer/Tests/sqlancer17.test b/sql/test/SQLancer/Tests/sqlancer17.test --- a/sql/test/SQLancer/Tests/sqlancer17.test +++ b/sql/test/SQLancer/Tests/sqlancer17.test @@ -33,263 +33,57 @@ statement ok START TRANSACTION statement ok -CREATE TABLE "t0" ("c2" DATE, CONSTRAINT "t0_c2_pkey" PRIMARY KEY ("c2")) - -statement ok rowcount 2 -INSERT INTO "t0" VALUES (DATE '1970-01-04'), (DATE '1970-01-01') - -query T rowsort -SELECT t0.c2 FROM t0 WHERE (t0.c2) IN (t0.c2, (VALUES (DATE '1969-12-10'), (DATE '1970-01-01'))) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list