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