Changeset: 17cd5bc3a87d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=17cd5bc3a87d
Removed Files:
sql/test/rdf/Tests/q8_v_small.reqtests
sql/test/rdf/Tests/q8_v_small.sql
sql/test/rdf/Tests/q8_v_small.stable.err
sql/test/rdf/Tests/q8_v_small.stable.out
Modified Files:
monetdb5/modules/mal/mkey.c
monetdb5/modules/mal/pcre.c
sql/server/sql_atom.c
sql/server/sql_semantic.c
sql/test/BugTracker-2009/Tests/AVG_of_SQRT.SF-2757642.timeout
sql/test/merge-partitions/Tests/mergepart20.sql
sql/test/merge-partitions/Tests/mergepart20.stable.out
sql/test/miscellaneous/Tests/simple_selects.sql
sql/test/miscellaneous/Tests/simple_selects.stable.out
sql/test/rdf/Tests/All
sql/test/rdf/Tests/q8_v.stable.err
sql/test/rdf/Tests/q8_v.stable.out
sql/test/rdf/Tests/q8_v.timeout
Branch: linear-hashing
Log Message:
Merged with Nov2019
diffs (truncated from 1816 to 300 lines):
diff --git a/monetdb5/modules/mal/mkey.c b/monetdb5/modules/mal/mkey.c
--- a/monetdb5/modules/mal/mkey.c
+++ b/monetdb5/modules/mal/mkey.c
@@ -51,6 +51,8 @@ MKEYhash(Client cntxt, MalBlkPtr mb, Mal
val= getArgReference(stk,p,1);
switch (ATOMstorage(tpe)) {
case TYPE_void:
+ *res = lng_nil; /* It can be called from SQL */
+ break;
case TYPE_bat:
case TYPE_ptr:
// illegal types, avoid falling into the default case.
diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c
--- a/monetdb5/modules/mal/pcre.c
+++ b/monetdb5/modules/mal/pcre.c
@@ -1542,7 +1542,6 @@ PCREindex(int *res, const pcre *pattern,
#endif
}
-
str
PCREpatindex(int *ret, const str *pat, const str *val)
{
@@ -1550,6 +1549,11 @@ PCREpatindex(int *ret, const str *pat, c
pcre *re = NULL;
char *ppat = NULL, *msg;
+ if (strNil(*pat) || strNil(*val)) {
+ *ret = int_nil;
+ return MAL_SUCCEED;
+ }
+
if ((msg = pat2pcre(&ppat, *pat)) != MAL_SUCCEED)
return msg;
if ((msg = pcre_compile_wrap(&re, ppat, FALSE)) != MAL_SUCCEED) {
@@ -1591,7 +1595,6 @@ PCREquote(str *ret, const str *val)
return MAL_SUCCEED;
}
-
str
PCREsql2pcre(str *ret, const str *pat, const str *esc)
{
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -456,10 +456,17 @@ atom2sql(atom *a)
return _STRDUP("true");
return _STRDUP("false");
case EC_CHAR:
- case EC_STRING:
+ case EC_STRING: {
+ char *val, *res;
assert(a->data.vtype == TYPE_str && a->data.val.sval);
- sprintf(buf, "'%s'", a->data.val.sval);
- break;
+
+ if (!(val = sql_escape_str(a->data.val.sval)))
+ return NULL;
+ if ((res = NEW_ARRAY(char, strlen(val) + 3)))
+ stpcpy(stpcpy(stpcpy(res, "'"), val), "'");
+ c_delete(val);
+ return res;
+ } break;
case EC_BLOB:
/* TODO atom to string */
break;
@@ -571,8 +578,21 @@ atom2sql(atom *a)
case EC_DATE:
case EC_TIMESTAMP:
if (a->data.vtype == TYPE_str) {
- assert(a->data.val.sval);
- sprintf(buf, "%s '%s'", a->tpe.type->sqlname,
a->data.val.sval);
+ char *val1 = sql_escape_str(a->tpe.type->sqlname),
*val2 = sql_escape_str(a->data.val.sval), *res;
+
+ if (!val1 || !val2) {
+ c_delete(val1);
+ c_delete(val2);
+ return NULL;
+ }
+
+ if ((res = NEW_ARRAY(char, strlen(val1) + strlen(val2)
+ 4)))
+ stpcpy(stpcpy(stpcpy(stpcpy(res, val1)," '"),
val2), "'");
+ c_delete(val1);
+ c_delete(val2);
+ return res;
+ } else {
+ snprintf(buf, BUFSIZ, "atom2sql(TYPE_%d) not
implemented", a->data.vtype);
}
break;
default:
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -258,7 +258,8 @@ supertype(sql_subtype *super, sql_subtyp
return super;
}
-char * toUpperCopy(char *dest, const char *src)
+char *
+toUpperCopy(char *dest, const char *src)
{
size_t i, len;
@@ -275,7 +276,8 @@ char * toUpperCopy(char *dest, const cha
return(dest);
}
-char *dlist2string(mvc *sql, dlist *l, int expression, char **err)
+char *
+dlist2string(mvc *sql, dlist *l, int expression, char **err)
{
char *b = NULL;
dnode *n;
@@ -308,88 +310,121 @@ char *dlist2string(mvc *sql, dlist *l, i
return b;
}
-char *symbol2string(mvc *sql, symbol *se, int expression, char **err) /**/
+char *
+symbol2string(mvc *sql, symbol *se, int expression, char **err) /**/
{
- int len = 0;
- char buf[BUFSIZ];
-
- buf[0] = 0;
switch (se->token) {
case SQL_NOP: {
- dnode *lst = se->data.lval->h;
- dnode *ops = lst->next->data.lval->h;
- char *op = qname_fname(lst->data.lval);
+ dnode *lst = se->data.lval->h, *ops = lst->next->data.lval->h,
*aux;
+ const char *op = qname_fname(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ int i = 0, nargs = 0;
+ char** inputs = NULL, *res;
+ size_t inputs_length = 0;
+
+ if (!sname)
+ sname = sql->session->schema->base.name;
+
+ for (aux = ops; aux; aux = aux->next) nargs++;
+ inputs = GDKzalloc(nargs * sizeof(char**));
- len = snprintf( buf+len, BUFSIZ-len, "%s(", op);
- for (; ops; ops = ops->next) {
- char *tmp = symbol2string(sql, ops->data.sym,
expression, err);
- if (tmp == NULL)
+ for (aux = ops; aux; aux = aux->next) {
+ if (!(inputs[i] = symbol2string(sql, aux->data.sym,
expression, err))) {
+ for (int j = 0; j < i; j++)
+ GDKfree(inputs[j]);
+ GDKfree(inputs);
return NULL;
- len = snprintf( buf+len, BUFSIZ-len, "%s%s",
- tmp,
- (ops->next)?",":"");
- _DELETE(tmp);
+ }
+ inputs_length += strlen(inputs[i]);
+ i++;
}
- len = snprintf( buf+len, BUFSIZ-len, ")");
+
+ if ((res = NEW_ARRAY(char, strlen(sname) + strlen(op) +
inputs_length + 6 + (nargs - 1 /* commas */) + 2))) {
+ char *concat = stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res,
"\""), sname), "\".\""), op), "\"(");
+ i = 0;
+ for (aux = ops; aux; aux = aux->next) {
+ concat = stpcpy(concat, inputs[i]);
+ if (aux->next)
+ concat = stpcpy(concat, ",");
+ i++;
+ }
+ concat = stpcpy(concat, ")");
+ }
+
+ for (int j = 0; j < nargs; j++)
+ GDKfree(inputs[j]);
+ GDKfree(inputs);
+ return res;
} break;
case SQL_BINOP: {
dnode *lst = se->data.lval->h;
- char *op = qname_fname(lst->data.lval);
- char *l;
- char *r;
- l = symbol2string(sql, lst->next->data.sym, expression, err);
- if (l == NULL)
- return NULL;
- r = symbol2string(sql, lst->next->next->data.sym, expression,
err);
- if (r == NULL) {
+ const char *op = qname_fname(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ char *l = NULL, *r = NULL, *res;
+
+ if (!sname)
+ sname = sql->session->schema->base.name;
+ if (!(l = symbol2string(sql, lst->next->data.sym, expression,
err)) || !(r = symbol2string(sql, lst->next->next->data.sym, expression, err)))
{
_DELETE(l);
+ _DELETE(r);
return NULL;
}
- len = snprintf( buf+len, BUFSIZ-len, "%s(%s,%s)", op, l, r);
+
+ if ((res = NEW_ARRAY(char, strlen(sname) + strlen(op) +
strlen(l) + strlen(r) + 9)))
+
stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "\""),
sname), "\".\""), op), "\"("), l), ","), r), ")");
+
_DELETE(l);
_DELETE(r);
+ return res;
} break;
case SQL_OP: {
dnode *lst = se->data.lval->h;
- char *op = qname_fname(lst->data.lval);
- len = snprintf( buf+len, BUFSIZ-len, "%s()", op );
+ const char *op = qname_fname(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ char *res;
+
+ if (!sname)
+ sname = sql->session->schema->base.name;
+
+ if ((res = NEW_ARRAY(char, strlen(sname) + strlen(op) + 8)))
+ stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "\""), sname),
"\".\""), op), "\"()");
+
+ return res;
} break;
case SQL_UNOP: {
dnode *lst = se->data.lval->h;
- char *op = qname_fname(lst->data.lval);
- char *l = symbol2string(sql, lst->next->data.sym, expression,
err);
- if (l == NULL)
+ const char *op = qname_fname(lst->data.lval), *sname =
qname_schema(lst->data.lval);
+ char *l = symbol2string(sql, lst->next->data.sym, expression,
err), *res;
+
+ if (!sname)
+ sname = sql->session->schema->base.name;
+ if (!l)
return NULL;
- len = snprintf( buf+len, BUFSIZ-len, "%s(%s)", op, l);
+
+ if ((res = NEW_ARRAY(char, strlen(sname) + strlen(op) +
strlen(l) + 8)))
+ stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res,
"\""), sname), "\".\""), op), "\"("), l), ")");
+
_DELETE(l);
- break;
+ return res;
}
case SQL_PARAMETER:
- strcpy(buf,"?");
- break;
+ return _STRDUP("?");
case SQL_NULL:
- strcpy(buf,"NULL");
- break;
+ return _STRDUP("NULL");
case SQL_ATOM:{
AtomNode *an = (AtomNode *) se;
if (an && an->a)
return atom2sql(an->a);
else
- strcpy(buf,"NULL");
- break;
+ return _STRDUP("NULL");
}
- case SQL_NEXT:{
- const char *seq = qname_table(se->data.lval);
- const char *sname = qname_schema(se->data.lval);
- const char *s;
+ case SQL_NEXT: {
+ const char *seq = qname_table(se->data.lval), *sname =
qname_schema(se->data.lval);
+ char *res;
if (!sname)
sname = sql->session->schema->base.name;
- s = sql_escape_ident(seq);
- if(!s)
- return NULL;
- len = snprintf( buf+len, BUFSIZ-len, "next value for
\"%s\".\"%s\"", sname, s);
- c_delete(s);
+
+ if ((res = NEW_ARRAY(char, strlen("next value for \"") +
strlen(sname) + strlen(seq) + 5)))
+ stpcpy(stpcpy(stpcpy(stpcpy(stpcpy(res, "next value for
\""), sname), "\".\""), seq), "\"");
+ return res;
} break;
case SQL_IDENT:
case SQL_COLUMN: {
@@ -401,45 +436,41 @@ char *symbol2string(mvc *sql, symbol *se
return atom2sql(a);
} else if (expression && dlist_length(l) == 1 && l->h->type ==
type_string) {
/* when compiling an expression, a column of a table
might be present in the symbol, so we need this case */
- return _STRDUP(l->h->data.sval);
- } else if (expression && dlist_length(l) == 2 && l->h->type ==
type_string && l->h->next->type == type_string) {
- char *first = l->h->data.sval;
- char *second = l->h->next->data.sval;
+ const char *op = l->h->data.sval;
char *res;
- if(!first || !second) {
+ if ((res = NEW_ARRAY(char, strlen(op) + 3)))
+ stpcpy(stpcpy(stpcpy(res, "\""), op), "\"");
+ return res;
+ } else if (expression && dlist_length(l) == 2 && l->h->type ==
type_string && l->h->next->type == type_string) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list