Changeset: 609ac383f294 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=609ac383f294
Added Files:
        sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.sql
        
sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.err
        
sql/test/BugTracker-2019/Tests/crash-in-rel_dependencies.Bug-6703.stable.out
Modified Files:
        gdk/gdk_string.c
        sql/backends/monet5/UDF/pyapi/conversion.c
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_statistics.c
        sql/backends/monet5/sql_statistics.h
        sql/server/rel_optimizer.c
        sql/server/rel_planner.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/BugTracker-2017/Tests/cleanup_statistics.Bug-6439.stable.out
        
sql/test/BugTracker-2017/Tests/crash_after_oidx_on_sys_statistics.Bug-6251.stable.out
        sql/test/BugTracker-2017/Tests/statistics_nils_not_eq_zero.Bug-6331.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-aritmetic-expressions-handling.Bug-6576.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-having-not-null-not-in.Bug-6557.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-having-not-null-not-in.Bug-6557.stable.err
        sql/test/BugTracker-2019/Tests/All
        sql/test/remote/Tests/partition_elim.stable.out
        sql/test/sys-schema/Tests/check_Not_Nullable_columns.sql
        sql/test/sys-schema/Tests/check_Not_Nullable_columns.stable.out
Branch: default
Log Message:

Merge with Apr2019 branch.


diffs (truncated from 1061 to 300 lines):

diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -630,7 +630,7 @@ strFromStr(const char *restrict src, siz
 
        if (!external) {
                size_t sz = strLen(src);
-               atommem(sz);
+               atommem(sz + 1);
                strncpy(*dst, src, sz + 1);
                return (ssize_t) sz;
        }
@@ -789,7 +789,7 @@ strToStr(char **restrict dst, size_t *re
 
        if (!external) {
                sz = strLen(src);
-               atommem(sz);
+               atommem(sz + 1);
                strncpy(*dst, src, sz + 1);
                return (ssize_t) sz;
        }
diff --git a/sql/backends/monet5/UDF/pyapi/conversion.c 
b/sql/backends/monet5/UDF/pyapi/conversion.c
--- a/sql/backends/monet5/UDF/pyapi/conversion.c
+++ b/sql/backends/monet5/UDF/pyapi/conversion.c
@@ -1075,6 +1075,7 @@ str ConvertFromSQLType(BAT *b, sql_subty
                {
                        void *element = (void *)BUNtail(li, p);
                        if (strConversion(&result, &length, element, false) < 
0) {
+                               BBPunfix((*ret_bat)->batCacheid);
                                return createException(MAL, "pyapi.eval",
                                                                           
SQLSTATE(PY000) "Failed to convert element to string.");
                        }
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -392,7 +392,7 @@ alter_table_del_table(mvc *sql, char *ms
 }
 
 static char *
-alter_table_set_access(Client cntxt, mvc *sql, char *sname, char *tname, int 
access)
+alter_table_set_access(mvc *sql, char *sname, char *tname, int access)
 {
        sql_schema *s = mvc_bind_schema(sql, sname);
        sql_table *t = NULL;
@@ -408,7 +408,7 @@ alter_table_set_access(Client cntxt, mvc
 
                        mvc_access(sql, t, access);
                        if (access == 0)
-                               sql_drop_statistics(cntxt, t);
+                               sql_drop_statistics(sql, t);
                }
        } else {
                throw(SQL,"sql.alter_table_set_access",SQLSTATE(42S02) "ALTER 
TABLE: no such table '%s' in schema '%s'", tname, sname);
@@ -1516,7 +1516,7 @@ SQLalter_set_table(Client cntxt, MalBlkP
        int access = *getArgReference_int(stk, pci, 3);
 
        initcontext();
-       msg = alter_table_set_access(cntxt, sql, sname, tname, access);
+       msg = alter_table_set_access(sql, sname, tname, access);
 
        return msg;
 }
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
@@ -21,61 +21,38 @@ analysis by optimizers.
 #include "sql_statistics.h"
 #include "sql_execute.h"
 
-#define atommem(size)                                  \
-       do {                                            \
-               if (*dst == NULL || *len < (size)) {    \
-                       GDKfree(*dst);                  \
-                       *len = (size);                  \
-                       *dst = GDKmalloc(*len);         \
-                       if (*dst == NULL)               \
-                               return -1;              \
-               }                                       \
-       } while (0)
-
-static ssize_t
-strToStrSQuote(char **dst, size_t *len, const void *src, bool external)
-{
-       ssize_t l = 0;
-
-       (void) external;
-       assert(external);
-       if (GDK_STRNIL((str) src)) {
-               atommem(4);
-
-               return snprintf(*dst, *len, "nil");
-       } else {
-               size_t sz = escapedStrlen(src, NULL, NULL, '\'');
-               atommem(sz + 3);
-               l = (ssize_t) escapedStr((*dst) + 1, src, *len - 1, NULL, NULL, 
'\'');
-               l++;
-               (*dst)[0] = (*dst)[l++] = '"';
-               (*dst)[l] = 0;
-       }
-       return l;
-}
-
 str
-sql_drop_statistics(Client cntxt, sql_table *t)
+sql_drop_statistics(mvc *m, sql_table *t)
 {
        node *ncol;
-       char *dquery, *msg = NULL;
+       sql_trans *tr;
+       sql_schema *sys;
+       sql_table *sysstats;
+       sql_column *statsid;
+       oid rid;
 
-       dquery = (char *) GDKzalloc(96);
-       if (dquery == NULL) {
-               throw(SQL, "analyze", SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
+       tr = m->session->tr;
+       sys = mvc_bind_schema(m, "sys");
+       if (sys == NULL)
+               throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "Internal 
error");
+       sysstats = mvc_bind_table(m, sys, "statistics");
+       if (sysstats == NULL)
+               throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "No table 
sys.statistics");
+       statsid = mvc_bind_column(m, sysstats, "column_id");
+       if (statsid == NULL)
+               throw(SQL, "sql_drop_statistics", SQLSTATE(3F000) "No table 
sys.statistics");
+
        if (isTable(t) && t->columns.set) {
                for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) {
                        sql_column *c = ncol->data;
 
-                       snprintf(dquery, 96, "delete from sys.statistics where 
\"column_id\" = %d;", c->base.id);
-                       msg = SQLstatementIntern(cntxt, &dquery, "SQLanalyze", 
TRUE, FALSE, NULL);
-                       if (msg)
-                               break;
+                       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");
                }
        }
-       GDKfree(dquery);
-       return msg;
+       return MAL_SUCCEED;
 }
 
 str
@@ -85,12 +62,10 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
        str msg = getSQLContext(cntxt, mb, &m, NULL);
        sql_trans *tr = m->session->tr;
        node *nsch, *ntab, *ncol;
-       char *query = NULL, *dquery;
-       size_t querylen = 0;
        char *maxval = NULL, *minval = NULL;
        size_t minlen = 0, maxlen = 0;
        str sch = 0, tbl = 0, col = 0;
-       bool sorted, revsorted;
+       bit sorted, revsorted;  /* not bool since address is taken */
        lng nils = 0;
        lng uniq = 0;
        lng samplesize = *getArgReference_lng(stk, pci, 2);
@@ -98,14 +73,24 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
        int width = 0;
        int minmax = *getArgReference_int(stk, pci, 1);
        int sfnd = 0, tfnd = 0, cfnd = 0;
+       sql_schema *sys;
+       sql_table *sysstats;
+       sql_column *statsid;
+       oid rid;
+       timestamp ts;
 
        if (msg != MAL_SUCCEED || (msg = checkSQLContext(cntxt)) != NULL)
                return msg;
 
-       dquery = (char *) GDKzalloc(96);
-       if (dquery == NULL) {
-               throw(SQL, "analyze", SQLSTATE(HY001) MAL_MALLOC_FAIL);
-       }
+       sys = mvc_bind_schema(m, "sys");
+       if (sys == NULL)
+               throw(SQL, "sql.analyze", SQLSTATE(3F000) "Internal error");
+       sysstats = mvc_bind_table(m, sys, "statistics");
+       if (sysstats == NULL)
+               throw(SQL, "sql.analyze", SQLSTATE(3F000) "No table 
sys.statistics");
+       statsid = mvc_bind_column(m, sysstats, "column_id");
+       if (statsid == NULL)
+               throw(SQL, "sql.analyze", SQLSTATE(3F000) "No table 
sys.statistics");
 
        switch (argc) {
        case 6:
@@ -137,8 +122,6 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                if (tbl && strcmp(bt->name, tbl))
                                        continue;
                                if (t->persistence != SQL_PERSIST) {
-                                       GDKfree(dquery);
-                                       GDKfree(query);
                                        GDKfree(maxval);
                                        GDKfree(minval);
                                        throw(SQL, "analyze", SQLSTATE(42S02) 
"Table '%s' is not persistent", bt->name);
@@ -170,10 +153,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                sz = BATcount(bn);
                                                tostr = 
BATatoms[bn->ttype].atomToStr;
 
-                                               if (tostr == 
BATatoms[TYPE_str].atomToStr)
-                                                       tostr = strToStrSQuote;
-
-                                               snprintf(dquery, 96, "delete 
from sys.statistics where \"column_id\" = %d;", c->base.id);
+                                               rid = 
table_funcs.column_find_row(tr, statsid, &c->base.id, NULL);
                                                cfnd = 1;
                                                if (samplesize > 0) {
                                                        bsample = BATsample(bn, 
(BUN) samplesize);
@@ -220,7 +200,6 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                        GDKfree(maxval);
                                                        maxval = GDKmalloc(4);
                                                        if (maxval == NULL) {
-                                                               GDKfree(dquery);
                                                                GDKfree(minval);
                                                                throw(SQL, 
"analyze", SQLSTATE(HY001) MAL_MALLOC_FAIL);
                                                        }
@@ -230,31 +209,28 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                        GDKfree(minval);
                                                        minval = GDKmalloc(4);
                                                        if (minval == NULL){
-                                                               GDKfree(dquery);
                                                                GDKfree(maxval);
                                                                throw(SQL, 
"analyze", SQLSTATE(HY001) MAL_MALLOC_FAIL);
                                                        }
                                                        minlen = 4;
                                                }
                                                if (tostr) {
-                                                       if ((val = 
BATmax(bn,0)) == NULL)
-                                                               strcpy(maxval, 
"nil");
+                                                       if ((val = BATmax(bn, 
NULL)) == NULL)
+                                                               strcpy(maxval, 
str_nil);
                                                        else {
-                                                               if 
(tostr(&maxval, &maxlen, val, true) < 0) {
+                                                               if 
(tostr(&maxval, &maxlen, val, false) < 0) {
                                                                        
GDKfree(val);
-                                                                       
GDKfree(dquery);
                                                                        
GDKfree(minval);
                                                                        
GDKfree(maxval);
                                                                        
throw(SQL, "analyze", GDK_EXCEPTION);
                                                                }
                                                                GDKfree(val);
                                                        }
-                                                       if ((val = 
BATmin(bn,0)) == NULL)
-                                                               strcpy(minval, 
"nil");
+                                                       if ((val = BATmin(bn, 
NULL)) == NULL)
+                                                               strcpy(minval, 
str_nil);
                                                        else {
-                                                               if 
(tostr(&minval, &minlen, val, true) < 0) {
+                                                               if 
(tostr(&minval, &minlen, val, false) < 0) {
                                                                        
GDKfree(val);
-                                                                       
GDKfree(dquery);
                                                                        
GDKfree(minval);
                                                                        
GDKfree(maxval);
                                                                        
throw(SQL, "analyze", GDK_EXCEPTION);
@@ -262,47 +238,24 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
                                                                GDKfree(val);
                                                        }
                                                } else {
-                                                       strcpy(maxval, "nil");
-                                                       strcpy(minval, "nil");
+                                                       strcpy(maxval, str_nil);
+                                                       strcpy(minval, str_nil);
                                                }
-                                               if (strlen(minval) + 
strlen(maxval) + 1024 > querylen) {
-                                                       querylen = 
strlen(minval) + strlen(maxval) + 1024;
-                                                       GDKfree(query);
-                                                       query = 
GDKmalloc(querylen);
-                                                       if (query == NULL) {
-                                                               GDKfree(dquery);
-                                                               GDKfree(maxval);
-                                                               GDKfree(minval);
-                                                               throw(SQL, 
"analyze", SQLSTATE(HY001) MAL_MALLOC_FAIL);
-                                                       }
-                                               }
-                                               snprintf(query, querylen, 
"insert into sys.statistics 
(column_id,type,width,stamp,\"sample\",count,\"unique\",nils,minval,maxval,sorted,revsorted)
 values(%d,'%s',%d,now()," LLFMT "," LLFMT "," LLFMT "," LLFMT 
",'%s','%s',%s,%s);", c->base.id, c->type.type->sqlname, width, (samplesize ? 
samplesize : sz), sz, uniq, nils, minval, maxval, sorted ? "true" : "false", 
revsorted ? "true" : "false");
-#ifdef DEBUG_SQL_STATISTICS
-                                               fprintf(stderr, "%s\n", dquery);
-                                               fprintf(stderr, "%s\n", query);
-#endif
                                                BBPunfix(bn->batCacheid);
-                                               msg = SQLstatementIntern(cntxt, 
&dquery, "SQLanalyze", TRUE, FALSE, NULL);
-                                               if (msg) {
-                                                       GDKfree(dquery);
-                                                       GDKfree(query);
+                                               MTIMEcurrent_timestamp(&ts);
+                                               if (!is_oid_nil(rid) && 
table_funcs.table_delete(tr, sysstats, rid) != LOG_OK) {
                                                        GDKfree(maxval);
                                                        GDKfree(minval);
-                                                       return msg;
+                                                       throw(SQL, "analyze", 
"delete failed");
                                                }
-                                               msg = SQLstatementIntern(cntxt, 
&query, "SQLanalyze", TRUE, FALSE, NULL);
-                                               if (msg) {
-                                                       GDKfree(dquery);
-                                                       GDKfree(query);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to