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