Changeset: 3ab7e51d3112 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3ab7e51d3112 Modified Files: monetdb5/optimizer/opt_pipes.c sql/backends/monet5/sql.c Branch: string_imprints Log Message:
Merge with default diffs (truncated from 422 to 300 lines): diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -3326,14 +3326,13 @@ BATgroupsize(BAT *b, BAT *g, BAT *e, BAT i = canditer_next(ci) - hseq; \ if (!skip_nils || \ !is_##TYPE##_nil(vals[i])) { \ - oids[i] = i + hseq; \ + oids[gid++] = i + hseq; \ nils--; \ } \ } \ TIMEOUT_CHECK(timeoffset, \ TIMEOUT_HANDLER(BUN_NONE)); \ } else { \ - gid = 0; /* in case gids == NULL */ \ TIMEOUT_LOOP(ncand, timeoffset) { \ i = canditer_next(ci) - hseq; \ if (gids == NULL || \ @@ -3365,7 +3364,7 @@ do_groupmin(oid *restrict oids, BATiter oid min, oid max, struct canditer *restrict ci, BUN ncand, bool skip_nils, bool gdense) { - oid gid; + oid gid = 0; BUN i, nils; int t; const void *nil; @@ -3423,15 +3422,16 @@ do_groupmin(oid *restrict oids, BATiter while (ncand > 0) { ncand--; i = canditer_next(ci); - oids[i - hseq] = i; + oids[gid++] = i; nils--; } } else { while (ncand > 0) { ncand--; i = canditer_next(ci); - if (is_oid_nil(oids[i - hseq])) { - oids[i - hseq] = i; + gid = gids[i - hseq] - min; + if (is_oid_nil(oids[gid])) { + oids[gid] = i; nils--; } } @@ -3447,14 +3447,13 @@ do_groupmin(oid *restrict oids, BATiter i = canditer_next(ci) - hseq; if (!skip_nils || (*atomcmp)(BUNtail(*bi, i), nil) != 0) { - oids[i] = i + hseq; + oids[gid++] = i + hseq; nils--; } } TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); } else { - gid = 0; /* in case gids == NULL */ TIMEOUT_LOOP(ncand, timeoffset) { i = canditer_next(ci) - hseq; if (gids == NULL || @@ -3495,7 +3494,7 @@ do_groupmax(oid *restrict oids, BATiter oid min, oid max, struct canditer *restrict ci, BUN ncand, bool skip_nils, bool gdense) { - oid gid; + oid gid = 0; BUN i, nils; int t; const void *nil; @@ -3553,16 +3552,17 @@ do_groupmax(oid *restrict oids, BATiter while (ncand > 0) { ncand--; i = canditer_next(ci); - oids[i - hseq] = i; + oids[gid++] = i; nils--; } } else { while (ncand > 0) { ncand--; i = canditer_next(ci); - if (is_oid_nil(oids[i - hseq])) + gid = gids[i - hseq] - min; + if (is_oid_nil(oids[gid])) nils--; - oids[i - hseq] = i; + oids[gid] = i; } } } @@ -3576,14 +3576,13 @@ do_groupmax(oid *restrict oids, BATiter i = canditer_next(ci) - hseq; if (!skip_nils || (*atomcmp)(BUNtail(*bi, i), nil) != 0) { - oids[i] = i + hseq; + oids[gid++] = i + hseq; nils--; } } TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); } else { - gid = 0; /* in case gids == NULL */ TIMEOUT_LOOP(ncand, timeoffset) { i = canditer_next(ci) - hseq; if (gids == NULL || diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c --- a/monetdb5/optimizer/opt_pipes.c +++ b/monetdb5/optimizer/opt_pipes.c @@ -67,8 +67,8 @@ static struct PIPELINES { "optimizer.profiler();" //"optimizer.candidates();" only for decoration in explain //"optimizer.mask();" - "optimizer.garbageCollector();", - "optimizer.profiler();" + "optimizer.garbageCollector();" + "optimizer.profiler();", "stable", NULL, 1}, {"minimal_fast", "optimizer.minimalfast()", @@ -113,8 +113,8 @@ static struct PIPELINES { "optimizer.postfix();" // "optimizer.jit();" awaiting the new batcalc api "optimizer.wlc();" - "optimizer.garbageCollector();", - "optimizer.profiler();" + "optimizer.garbageCollector();" + "optimizer.profiler();", "stable", NULL, 1}, {"strimps_pipe", "optimizer.inline();" @@ -190,8 +190,8 @@ static struct PIPELINES { // "optimizer.jit();" awaiting the new batcalc api "optimizer.oltp();" "optimizer.wlc();" - "optimizer.garbageCollector();", - "optimizer.profiler();" + "optimizer.garbageCollector();" + "optimizer.profiler();", "stable", NULL, 1}, /* * Volcano style execution produces a sequence of blocks from the source relation @@ -228,8 +228,8 @@ static struct PIPELINES { "optimizer.postfix();" // "optimizer.jit();" awaiting the new batcalc api "optimizer.wlc();" - "optimizer.garbageCollector();", - "optimizer.profiler();" + "optimizer.garbageCollector();" + "optimizer.profiler();", "stable", NULL, 1}, /* The no_mitosis pipe line is (and should be kept!) identical to the * default pipeline, except that optimizer mitosis is omitted. It is @@ -271,8 +271,8 @@ static struct PIPELINES { "optimizer.postfix();" // "optimizer.jit();" awaiting the new batcalc api "optimizer.wlc();" - "optimizer.garbageCollector();", - "optimizer.profiler();" + "optimizer.garbageCollector();" + "optimizer.profiler();", "stable", NULL, 1}, /* The sequential pipe line is (and should be kept!) identical to the * default pipeline, except that optimizers mitosis & dataflow are @@ -313,8 +313,8 @@ static struct PIPELINES { "optimizer.postfix();" // "optimizer.jit();" awaiting the new batcalc api "optimizer.wlc();" - "optimizer.garbageCollector();", - "optimizer.profiler();" + "optimizer.garbageCollector();" + "optimizer.profiler();", "stable", NULL, 1}, /* Experimental pipelines stressing various components under * development. Do not use any of these pipelines in production 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 @@ -600,6 +600,8 @@ create_table_from_emit(Client cntxt, cha if (columns[i].name && columns[i].name[0] == '%') throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: generated labels not allowed in column names, use an alias instead"); + if (tpe.type->eclass == EC_ANY) + throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: any type (plain null value) not allowed as a column type, use an explicit cast"); switch (mvc_create_column(&col, sql, t, columns[i].name, &tpe)) { case -1: throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL); diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -150,6 +150,12 @@ as_subquery(mvc *sql, sql_table *t, tabl if (tt != tt_view && cname && cname[0] == '%') { sql_error(sql, 01, SQLSTATE(42000) "%s: generated labels not allowed in column names, use an alias instead", msg); return -1; + } else if (!tp) { + sql_error(sql, 01, SQLSTATE(42000) "%s: columns must have a type defined", msg); + return -1; + } else if (tp->type->eclass == EC_ANY) { + sql_error(sql, 01, SQLSTATE(42000) "%s: any type (plain null value) not allowed as a column type, use an explicit cast", msg); + return -1; } else if (mvc_bind_column(sql, t, cname)) { sql_error(sql, 01, SQLSTATE(42S21) "%s: duplicate column name %s", msg, cname); return -1; @@ -171,21 +177,24 @@ as_subquery(mvc *sql, sql_table *t, tabl return -1; } } else { - node *m; - - for (m = r->exps->h; m; m = m->next) { + for (node *m = r->exps->h; m; m = m->next) { sql_exp *e = m->data; const char *cname = exp_name(e); sql_subtype *tp = exp_subtype(e); sql_column *col = NULL; - if (tt != tt_view && cname && cname[0] == '%') { + if (!cname) + cname = "v"; + if (tt != tt_view && cname[0] == '%') { sql_error(sql, 01, SQLSTATE(42000) "%s: generated labels not allowed in column names, use an alias instead", msg); return -1; - } - if (!cname) - cname = "v"; - if (mvc_bind_column(sql, t, cname)) { + } else if (!tp) { + sql_error(sql, 01, SQLSTATE(42000) "%s: columns must have a type defined", msg); + return -1; + } else if (tp->type->eclass == EC_ANY) { + sql_error(sql, 01, SQLSTATE(42000) "%s: any type (plain null value) not allowed as a column type, use an explicit cast", msg); + return -1; + } else if (mvc_bind_column(sql, t, cname)) { sql_error(sql, 01, SQLSTATE(42S21) "%s: duplicate column name %s", msg, cname); return -1; } @@ -864,6 +873,9 @@ create_column(sql_query *query, symbol * if (!isView(t) && cname && cname[0] == '%') { sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: generated labels not allowed in column names, use an alias instead", (alter)?"ALTER":"CREATE"); return SQL_ERR; + } else if (ctype->type->eclass == EC_ANY) { + sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: any type (plain null value) not allowed as a column type, use an explicit cast", (alter)?"ALTER":"CREATE"); + return SQL_ERR; } else if ((cs = find_sql_column(t, cname))) { sql_error(sql, 02, SQLSTATE(42S21) "%s TABLE: a column named '%s' already exists\n", (alter)?"ALTER":"CREATE", cname); return SQL_ERR; @@ -1081,6 +1093,7 @@ table_element(sql_query *query, symbol * sql_error(sql, 02, SQLSTATE(42S21) "%s: a column named '%s' already exists\n", action, oc->base.name); return SQL_ERR; } + assert(oc->type.type->eclass != EC_ANY); switch (mvc_create_column(&nc, sql, t, oc->base.name, &oc->type)) { case -1: sql_error(sql, 01, SQLSTATE(HY013) MAL_MALLOC_FAIL); @@ -2089,8 +2102,7 @@ rel_create_index(mvc *sql, char *iname, sql_exp **updates, *e; sql_idx *i; dnode *n; - char *sname = qname_schema(qname); - char *tname = qname_schema_object(qname); + char *sname = qname_schema(qname), *tname = qname_schema_object(qname), *s = iname; if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, "CREATE INDEX", false))) return NULL; @@ -2098,6 +2110,12 @@ rel_create_index(mvc *sql, char *iname, return sql_error(sql, 02, SQLSTATE(42000) "CREATE INDEX: cannot create index on a declared table"); if (!mvc_schema_privs(sql, t->s)) return sql_error(sql, 02, SQLSTATE(42000) "CREATE INDEX: access denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), t->s->base.name); + if (!s || !*s) /* add this to be safe */ + return sql_error(sql, 02, SQLSTATE(42000) "CREATE INDEX: index name cannot be empty"); + while (isdigit((unsigned char) *s)) + s++; + if (!*s) /* if an index just contains digit characters, it can be mistaken with a label */ + return sql_error(sql, 02, SQLSTATE(42000) "CREATE INDEX: indexes cannot contain just digit characters (0 through 9)"); if ((i = mvc_bind_idx(sql, t->s, iname))) return sql_error(sql, 02, SQLSTATE(42S11) "CREATE INDEX: name '%s' already in use", iname); if (!isTable(t)) diff --git a/sql/test/SQLancer/Tests/sqlancer04.test b/sql/test/SQLancer/Tests/sqlancer04.test --- a/sql/test/SQLancer/Tests/sqlancer04.test +++ b/sql/test/SQLancer/Tests/sqlancer04.test @@ -688,7 +688,7 @@ create view v38(vc0) as (select all cast statement ok create view v43(vc0, vc1) as (select distinct cast(case 0.635420284843984273237538218381814658641815185546875 when -0.94514286975825123615635448004468344151973724365234375 then 0.8788786 end as bigint), null +0.94514286975825123615635448004468344151973724365234375 then 0.8788786 end as bigint), cast(null as clob) where ((-1975284152)<=(17772))) with check option query I rowsort diff --git a/sql/test/SQLancer/Tests/sqlancer08.test b/sql/test/SQLancer/Tests/sqlancer08.test --- a/sql/test/SQLancer/Tests/sqlancer08.test +++ b/sql/test/SQLancer/Tests/sqlancer08.test @@ -247,7 +247,7 @@ statement ok rowcount 9 INSERT INTO "salesmart" VALUES ('pT펈*1.{'),('1870507234'),('27825'),('/aF⯗u'),('10545346022400.000'),(''),('-1533465369'),(''),('29781') statement ok _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list