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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list