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

Reply via email to