Changeset: e93941ce6806 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e93941ce6806
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
sql/test/sysmon/Tests/All
Branch: userstats
Log Message:
merged with default
diffs (truncated from 508 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -3804,8 +3804,8 @@ stdout of test 'MAL-signatures` in direc
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:oid],
X_2:int):bat[:daytime] ", "nil_2time_daytime;", "" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:lng],
X_2:bat[:oid], X_3:int):bat[:daytime] ", "second_interval_2_daytime;",
"" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:lng],
X_2:int):bat[:daytime] ", "second_interval_2_daytime;", "" ]
-[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:daytime],
X_2:bat[:oid], X_3:int, X_4:int):bat[:daytime] ", "str_2time_daytimetz;", ""
]
-[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:daytime],
X_2:int, X_3:int):bat[:daytime] ", "str_2time_daytimetz;", "" ]
+[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:str],
X_2:bat[:oid], X_3:int, X_4:int):bat[:daytime] ", "str_2time_daytimetz;",
"" ]
+[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:str],
X_2:int, X_3:int):bat[:daytime] ", "str_2time_daytimetz;", "" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:timestamp],
X_2:bat[:oid], X_3:int):bat[:daytime] ", "timestamp_2_daytime;", "" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:timestamp],
X_2:int):bat[:daytime] ", "timestamp_2_daytime;", "" ]
[ "batcalc", "dbl", "pattern batcalc.dbl(X_1:bat[:bit]):bat[:dbl] ",
"CMDconvertsignal_dbl;", "" ]
@@ -4753,10 +4753,15 @@ stdout of test 'MAL-signatures` in direc
[ "batcalc", "mod_noerror", "pattern batcalc.mod_noerror(X_1:sht,
X_2:bat[:sht], X_3:bat[:oid]):bat[:int] ", "CMDbatMOD;", "" ]
[ "batcalc", "mod_noerror", "pattern batcalc.mod_noerror(X_1:sht,
X_2:bat[:sht], X_3:bat[:oid]):bat[:lng] ", "CMDbatMOD;", "" ]
[ "batcalc", "mod_noerror", "pattern batcalc.mod_noerror(X_1:sht,
X_2:bat[:sht], X_3:bat[:oid]):bat[:sht] ", "CMDbatMOD;", "" ]
+[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:bte], X_2:bat[:oid], X_3:int,
X_4:int):bat[:int] ", "month_interval;", "" ]
[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:bte], X_2:int, X_3:int):bat[:int] ",
"month_interval;", "" ]
+[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:int], X_2:bat[:oid], X_3:int,
X_4:int):bat[:int] ", "month_interval;", "" ]
[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:int], X_2:int, X_3:int):bat[:int] ",
"month_interval;", "" ]
+[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:lng], X_2:bat[:oid], X_3:int,
X_4:int):bat[:int] ", "month_interval;", "" ]
[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:lng], X_2:int, X_3:int):bat[:int] ",
"month_interval;", "" ]
+[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:sht], X_2:bat[:oid], X_3:int,
X_4:int):bat[:int] ", "month_interval;", "" ]
[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:sht], X_2:int, X_3:int):bat[:int] ",
"month_interval;", "" ]
+[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:str], X_2:bat[:oid], X_3:int,
X_4:int):bat[:int] ", "month_interval_str;", "" ]
[ "batcalc", "month_interval", "pattern
batcalc.month_interval(X_1:bat[:str], X_2:int, X_3:int):bat[:int] ",
"month_interval_str;", "" ]
[ "batcalc", "mul_noerror", "pattern batcalc.mul_noerror(X_1:bat[:bte],
X_2:bat[:bte], X_3:bat[:oid], X_4:bat[:oid]):bat[:bte] ", "CMDbatMUL;", ""
]
[ "batcalc", "mul_noerror", "pattern batcalc.mul_noerror(X_1:bat[:bte],
X_2:bat[:dbl], X_3:bat[:oid], X_4:bat[:oid]):bat[:dbl] ", "CMDbatMUL;", ""
]
@@ -5055,16 +5060,26 @@ stdout of test 'MAL-signatures` in direc
[ "batcalc", "rsh_noerror", "pattern batcalc.rsh_noerror(X_1:sht,
X_2:bat[:lng], X_3:bat[:oid]):bat[:sht] ", "CMDbatRSH;", "" ]
[ "batcalc", "rsh_noerror", "pattern batcalc.rsh_noerror(X_1:sht,
X_2:bat[:sht]):bat[:sht] ", "CMDbatRSH;", "" ]
[ "batcalc", "rsh_noerror", "pattern batcalc.rsh_noerror(X_1:sht,
X_2:bat[:sht], X_3:bat[:oid]):bat[:sht] ", "CMDbatRSH;", "" ]
-[ "batcalc", "second_interval", "command
batcalc.second_interval(X_1:int, X_2:bat[:bte], X_3:int, X_4:int):bat[:lng] ",
"bte_batdec2second_interval;", "" ]
-[ "batcalc", "second_interval", "command
batcalc.second_interval(X_1:int, X_2:bat[:int], X_3:int, X_4:int):bat[:lng] ",
"int_batdec2second_interval;", "" ]
-[ "batcalc", "second_interval", "command
batcalc.second_interval(X_1:int, X_2:bat[:lng], X_3:int, X_4:int):bat[:lng] ",
"lng_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:bte], X_3:bat[:oid], X_4:int,
X_5:int):bat[:lng] ", "bte_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:bte], X_3:int, X_4:int):bat[:lng] ",
"bte_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:int], X_3:bat[:oid], X_4:int,
X_5:int):bat[:lng] ", "int_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:int], X_3:int, X_4:int):bat[:lng] ",
"int_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:lng], X_3:bat[:oid], X_4:int,
X_5:int):bat[:lng] ", "lng_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:lng], X_3:int, X_4:int):bat[:lng] ",
"lng_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:bte], X_2:bat[:oid], X_3:int,
X_4:int):bat[:lng] ", "second_interval;", "" ]
[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:bte], X_2:int, X_3:int):bat[:lng] ",
"second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:int], X_2:bat[:oid], X_3:int,
X_4:int):bat[:lng] ", "second_interval;", "" ]
[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:int], X_2:int, X_3:int):bat[:lng] ",
"second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:lng], X_2:bat[:oid], X_3:int,
X_4:int):bat[:lng] ", "second_interval;", "" ]
[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:lng], X_2:int, X_3:int):bat[:lng] ",
"second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:sht], X_2:bat[:oid], X_3:int,
X_4:int):bat[:lng] ", "second_interval;", "" ]
[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:sht], X_2:int, X_3:int):bat[:lng] ",
"second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:daytime], X_2:bat[:oid], X_3:int,
X_4:int):bat[:lng] ", "second_interval_daytime;", "" ]
[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:daytime], X_2:int, X_3:int):bat[:lng] ",
"second_interval_daytime;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:str], X_2:bat[:oid], X_3:int,
X_4:int):bat[:lng] ", "second_interval_str;", "" ]
[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:bat[:str], X_2:int, X_3:int):bat[:lng] ",
"second_interval_str;", "" ]
-[ "batcalc", "second_interval", "command
batcalc.second_interval(X_1:int, X_2:bat[:sht], X_3:int, X_4:int):bat[:lng] ",
"sht_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:sht], X_3:bat[:oid], X_4:int,
X_5:int):bat[:lng] ", "sht_batdec2second_interval;", "" ]
+[ "batcalc", "second_interval", "pattern
batcalc.second_interval(X_1:int, X_2:bat[:sht], X_3:int, X_4:int):bat[:lng] ",
"sht_batdec2second_interval;", "" ]
[ "batcalc", "sht", "pattern batcalc.sht(X_1:bat[:bit]):bat[:sht] ",
"CMDconvertsignal_sht;", "" ]
[ "batcalc", "sht", "pattern batcalc.sht(X_1:bat[:bit],
X_2:bat[:oid]):bat[:sht] ", "CMDconvertsignal_sht;", "" ]
[ "batcalc", "sht", "pattern batcalc.sht(X_1:bat[:bte]):bat[:sht] ",
"CMDconvertsignal_sht;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -5352,8 +5352,8 @@ stdout of test 'MAL-signatures` in direc
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:oid],
X_2:int):bat[:daytime] ", "nil_2time_daytime;", "" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:lng],
X_2:bat[:oid], X_3:int):bat[:daytime] ", "second_interval_2_daytime;",
"" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:lng],
X_2:int):bat[:daytime] ", "second_interval_2_daytime;", "" ]
-[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:daytime],
X_2:bat[:oid], X_3:int, X_4:int):bat[:daytime] ", "str_2time_daytimetz;", ""
]
-[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:daytime],
X_2:int, X_3:int):bat[:daytime] ", "str_2time_daytimetz;", "" ]
+[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:str],
X_2:bat[:oid], X_3:int, X_4:int):bat[:daytime] ", "str_2time_daytimetz;",
"" ]
+[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:str],
X_2:int, X_3:int):bat[:daytime] ", "str_2time_daytimetz;", "" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:timestamp],
X_2:bat[:oid], X_3:int):bat[:daytime] ", "timestamp_2_daytime;", "" ]
[ "batcalc", "daytime", "pattern batcalc.daytime(X_1:bat[:timestamp],
X_2:int):bat[:daytime] ", "timestamp_2_daytime;", "" ]
[ "batcalc", "dbl", "pattern batcalc.dbl(X_1:bat[:bit]):bat[:dbl] ",
"CMDconvertsignal_dbl;", "" ]
diff --git a/monetdb5/mal/mal_debugger.c b/monetdb5/mal/mal_debugger.c
--- a/monetdb5/mal/mal_debugger.c
+++ b/monetdb5/mal/mal_debugger.c
@@ -104,7 +104,7 @@ printBATelm(stream *f, bat i, BUN cnt, B
if (bs[1] == NULL)
mnstr_printf(f, "Failed to take chunk\n");
else {
- bs[0] = BATdense(bs[1]->hseqbase, 0,
BATcount(bs[1]));
+ bs[0] = BATdense(0, bs[1]->hseqbase,
BATcount(bs[1]));
if( bs[0] == NULL){
mnstr_printf(f, "Failed to take chunk
index\n");
} else {
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -697,7 +697,9 @@ exp2bin_case(backend *be, sql_exp *fe, s
if (next_cond) {
ncond = cond = es;
if (!ncond->nrcols) {
- if (isel)
+ if (osel)
+ ncond = stmt_const(be, nsel,
ncond);
+ else if (isel)
ncond = stmt_const(be, isel,
ncond);
else
ncond = stmt_const(be,
bin_first_column(be, left), ncond);
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
@@ -5687,8 +5687,8 @@ static mel_func sql_init_funcs[] = {
pattern("calc", "daytime", daytime_2time_daytime, false, "cast daytime to
daytime and check for overflow", args(1,3,
arg("",daytime),arg("v",daytime),arg("digits",int))),
command("batcalc", "daytime", batstr_2time_daytime, false, "cast to daytime
and check for overflow", args(1,3,
batarg("",daytime),batarg("v",str),arg("digits",int))),
command("batcalc", "daytime", batstr_2time_daytime_cand, false, "cast to
daytime and check for overflow", args(1,4,
batarg("",daytime),batarg("v",str),batarg("s",oid),arg("digits",int))),
- pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to
daytime and check for overflow", args(1,4,
batarg("",daytime),batarg("v",daytime),arg("digits",int),arg("has_tz",int))),
- pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to
daytime and check for overflow", args(1,5,
batarg("",daytime),batarg("v",daytime),batarg("s",oid),arg("digits",int),arg("has_tz",int))),
+ pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to
daytime and check for overflow", args(1,4,
batarg("",daytime),batarg("v",str),arg("digits",int),arg("has_tz",int))),
+ pattern("batcalc", "daytime", str_2time_daytimetz, false, "cast daytime to
daytime and check for overflow", args(1,5,
batarg("",daytime),batarg("v",str),batarg("s",oid),arg("digits",int),arg("has_tz",int))),
pattern("batcalc", "daytime", daytime_2time_daytime, false, "cast daytime to
daytime and check for overflow", args(1,3,
batarg("",daytime),batarg("v",daytime),arg("digits",int))),
pattern("batcalc", "daytime", daytime_2time_daytime, false, "cast daytime to
daytime and check for overflow", args(1,4,
batarg("",daytime),batarg("v",daytime),batarg("s",oid),arg("digits",int))),
command("sql", "date_trunc", bat_date_trunc, false, "Truncate a timestamp to
(millennium, century,decade,year,quarter,month,week,day,hour,minute,second,
milliseconds,microseconds)", args(1,3,
batarg("",timestamp),arg("scale",str),batarg("v",timestamp))),
@@ -5737,7 +5737,7 @@ static mel_func sql_init_funcs[] = {
pattern("batcalc", "month_interval", month_interval, false, "cast lng to a
month_interval and check for overflow", args(1,5,
batarg("",int),batarg("v",lng),batarg("s",oid),arg("ek",int),arg("sk",int))),
pattern("calc", "second_interval", second_interval, false, "cast lng to a
second_interval and check for overflow", args(1,4,
arg("",lng),arg("v",lng),arg("ek",int),arg("sk",int))),
pattern("batcalc", "second_interval", second_interval, false, "cast lng to a
second_interval and check for overflow", args(1,4,
batarg("",lng),batarg("v",lng),arg("ek",int),arg("sk",int))),
- pattern("batcalc", "second_interval", second_interval, false, "cast lng to a
second_interval and check for overflow", args(1,5,
batarg("",lng),batarg("v",lng),batarg("s",oid),arg("ek",int),arg("sk",int))),
+ pattern("batcalc", "second_interval", second_interval, false, "cast lng to a
second_interval and check for overflow", args(1,5,
batarg("",lng),batarg("v",lng),batarg("s",oid),arg("ek",int),arg("sk",int))),
pattern("calc", "rowid", sql_rowid, false, "return the next rowid", args(1,4,
arg("",oid),argany("v",1),arg("schema",str),arg("table",str))),
pattern("sql", "shrink", SQLshrink, true, "Consolidate the deletion table
over all columns using shrinking", args(0,2, arg("sch",str),arg("tbl",str))),
pattern("sql", "reuse", SQLreuse, true, "Consolidate the deletion table over
all columns reusing deleted slots", args(0,2, arg("sch",str),arg("tbl",str))),
diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c
--- a/sql/backends/monet5/sql_cast.c
+++ b/sql/backends/monet5/sql_cast.c
@@ -215,7 +215,7 @@ SQLbatstr_cast(Client cntxt, MalBlkPtr m
BBPkeepref(*res = dst->batCacheid);
BBPunfix(b->batCacheid);
if (s)
- BBPunfix(b->batCacheid);
+ BBPunfix(s->batCacheid);
return msg;
}
diff --git a/sql/backends/monet5/sql_round_impl.h
b/sql/backends/monet5/sql_round_impl.h
--- a/sql/backends/monet5/sql_round_impl.h
+++ b/sql/backends/monet5/sql_round_impl.h
@@ -373,7 +373,7 @@ batstr_2dec(Client cntxt, MalBlkPtr mb,
BATiter bi;
oid off;
struct canditer ci = {0};
- TYPE *restrict ret, v;
+ TYPE *restrict ret;
(void) cntxt;
(void) mb;
@@ -398,9 +398,8 @@ batstr_2dec(Client cntxt, MalBlkPtr mb,
BUN p = (BUN) (canditer_next(&ci) - off);
const str next = BUNtail(bi, p);
- if ((msg = str_2dec_body(&v, next, d, sk)))
+ if ((msg = str_2dec_body(&(ret[i]), next, d, sk)))
goto bailout;
- ret[p] = v;
}
bailout:
@@ -491,29 +490,29 @@ batdec2second_interval(Client cntxt, Mal
for (BUN i = 0 ; i < q ; i++) {
BUN p = (BUN) (canditer_next(&ci) - off);
if (ISNIL(TYPE)(src[p])) {
- ret[p] = lng_nil;
+ ret[i] = lng_nil;
} else {
BIG next = (BIG) src[p];
next *= multiplier;
- ret[p] = next;
+ ret[i] = next;
}
}
} else if (sc > 3) {
for (BUN i = 0 ; i < q ; i++) {
BUN p = (BUN) (canditer_next(&ci) - off);
if (ISNIL(TYPE)(src[p])) {
- ret[p] = lng_nil;
+ ret[i] = lng_nil;
} else {
BIG next = (BIG) src[p];
next += offset;
next /= divider;
- ret[p] = next;
+ ret[i] = next;
}
}
} else {
for (BUN i = 0 ; i < q ; i++) {
BUN p = (BUN) (canditer_next(&ci) - off);
- ret[p] = ISNIL(TYPE)(src[p]) ? lng_nil : (BIG) src[p];
+ ret[i] = ISNIL(TYPE)(src[p]) ? lng_nil : (BIG) src[p];
}
}
diff --git a/sql/backends/monet5/sql_statistics.c
b/sql/backends/monet5/sql_statistics.c
--- a/sql/backends/monet5/sql_statistics.c
+++ b/sql/backends/monet5/sql_statistics.c
@@ -34,9 +34,7 @@ sql_drop_statistics(mvc *m, sql_table *t
tr = m->session->tr;
sys = mvc_bind_schema(m, "sys");
if (sys == NULL)
- throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "Internal
error");
- if (!mvc_schema_privs(m, sys))
- throw(SQL, "sql.sql_drop_statistics", SQLSTATE(42000) "Access
denied for %s to schema '%s'", sqlvar_get_string(find_global_var(m,
mvc_bind_schema(m, "sys"), "current_user")), sys->base.name);
+ throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "Internal
error: No schema sys");
sysstats = mvc_bind_table(m, sys, "statistics");
if (sysstats == NULL)
throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "No table
sys.statistics");
@@ -44,6 +42,22 @@ sql_drop_statistics(mvc *m, sql_table *t
if (statsid == NULL)
throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "No table
sys.statistics");
+ /* Do all the validations before any drop */
+ if (!isTable(t))
+ throw(SQL, "sql_drop_statistics", SQLSTATE(42S02) "DROP
STATISTICS: %s '%s' is not persistent", TABLE_TYPE_DESCRIPTION(t->type,
t->properties), t->base.name);
+ if (!table_privs(m, t, PRIV_SELECT))
+ throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP
STATISTICS: access denied for %s to table '%s.%s'",
+ sqlvar_get_string(find_global_var(m,
mvc_bind_schema(m, "sys"), "current_user")), t->s->base.name, t->base.name);
+ if (isTable(t) && t->columns.set) {
+ for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) {
+ sql_column *c = (sql_column *) ncol->data;
+
+ if (!column_privs(m, c, PRIV_SELECT))
+ throw(SQL, "sql_drop_statistics",
SQLSTATE(42000) "DROP STATISTICS: access denied for %s to column '%s' on table
'%s.%s'",
+ sqlvar_get_string(find_global_var(m,
mvc_bind_schema(m, "sys"), "current_user")), c->base.name, t->s->base.name,
t->base.name);
+ }
+ }
+
if (isTable(t) && t->columns.set) {
for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) {
sql_column *c = ncol->data;
@@ -51,7 +65,7 @@ sql_drop_statistics(mvc *m, sql_table *t
rid = table_funcs.column_find_row(tr, statsid,
&c->base.id, NULL);
if (!is_oid_nil(rid) &&
table_funcs.table_delete(tr, sysstats, rid) !=
LOG_OK)
- throw(SQL, "analyze", "delete failed");
+ throw(SQL, "sql_drop_statistics", "delete
failed");
}
}
return MAL_SUCCEED;
@@ -87,8 +101,6 @@ sql_analyze(Client cntxt, MalBlkPtr mb,
sys = mvc_bind_schema(m, "sys");
if (sys == NULL)
throw(SQL, "sql.analyze", SQLSTATE(3F000) "Internal error: No
schema sys");
- if (!mvc_schema_privs(m, sys))
- throw(SQL, "sql.analyze", SQLSTATE(42000) "Access denied for %s
to schema '%s'", sqlvar_get_string(find_global_var(m, mvc_bind_schema(m,
"sys"), "current_user")), sys->base.name);
sysstats = mvc_bind_table(m, sys, "statistics");
if (sysstats == NULL)
throw(SQL, "sql.analyze", SQLSTATE(3F000) "Internal error: No
table sys.statistics");
@@ -109,6 +121,48 @@ sql_analyze(Client cntxt, MalBlkPtr mb,
TRC_DEBUG(SQL_PARSER, "analyze %s.%s.%s sample " LLFMT "%s\n", (sch ?
sch : ""), (tbl ? tbl : " "), (col ? col : " "), samplesize,
(minmax)?"MinMax":"");
+ /* Do all the validations before doing any analyze */
+ for (nsch = tr->schemas.set->h; nsch; nsch = nsch->next) {
+ sql_schema *s = (sql_schema *) nsch->data;
+ if (!isalpha((unsigned char) s->base.name[0]))
+ continue;
+
+ if (sch && strcmp(s->base.name, sch))
+ continue;
+ sfnd = 1;
+ if (s->tables.set)
+ for (ntab = (s)->tables.set->h; ntab; ntab =
ntab->next) {
+ sql_table *t = (sql_table *) ntab->data;
+
+ if (tbl && strcmp(t->base.name, tbl))
+ continue;
+ tfnd = 1;
+ if (tbl && !isTable(t))
+ throw(SQL, "analyze", SQLSTATE(42S02)
"%s '%s' is not persistent", TABLE_TYPE_DESCRIPTION(t->type, t->properties),
t->base.name);
+ if (!table_privs(m, t, PRIV_SELECT))
+ throw(SQL, "analyze", SQLSTATE(42000)
"ANALYZE: access denied for %s to table '%s.%s'",
+
sqlvar_get_string(find_global_var(m, mvc_bind_schema(m, "sys"),
"current_user")), t->s->base.name, t->base.name);
+ if (isTable(t) && t->columns.set) {
+ for (ncol = (t)->columns.set->h; ncol;
ncol = ncol->next) {
+ sql_column *c = (sql_column *)
ncol->data;
+
+ if (col && strcmp(c->base.name,
col))
+ continue;
+ cfnd = 1;
+ if (!column_privs(m, c,
PRIV_SELECT))
+ throw(SQL, "analyze",
SQLSTATE(42000) "ANALYZE: access denied for %s to column '%s' on table
'%s.%s'",
+
sqlvar_get_string(find_global_var(m, mvc_bind_schema(m, "sys"),
"current_user")), c->base.name, t->s->base.name, t->base.name);
+ }
+ }
+ }
+ }
+ if (sch && !sfnd)
+ throw(SQL, "analyze", SQLSTATE(3F000) "Schema '%s' does not
exist", sch);
+ if (tbl && !tfnd)
+ throw(SQL, "analyze", SQLSTATE(42S02) "Table '%s' does not
exist", tbl);
+ if (col && !cfnd)
+ throw(SQL, "analyze", SQLSTATE(38000) "Column '%s' does not
exist", col);
+
for (nsch = tr->schemas.set->h; nsch; nsch = nsch->next) {
sql_base *b = nsch->data;
sql_schema *s = (sql_schema *) nsch->data;
@@ -117,7 +171,6 @@ sql_analyze(Client cntxt, MalBlkPtr mb,
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list