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

Reply via email to