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

Reply via email to